合并 Grails Vue 配置文件客户端和服务器项目
了解如何生成 JAR 文件,以结合 Vue 和 Grails 产品工艺品。
作者:Nirav Assar、Zachary Klein
Grails 版本 3.3.8
1 Grails 培训
Grails 培训 - 由创建和积极维护 Grails 框架的人员开发和提供!
2 入门
在本指南中,您将创建 Vue 配置文件的server
和client
项目的合并构建。默认情况下,Vue 配置文件设置单独的前端和后端应用,这可以提升开发流程的效率。但可能并不符合部署需要,特别是如果您的整个应用要部署到 servlet 容器(例如 Tomcat)或作为“胖”JAR 执行。借助 Grails 和 Gradle 构建工具的灵活性,我们只需进行一些更改便可以配置 Grails/Vue 应用的统一构建。
2.1 所需内容
要完成此指南,您需要以下内容
-
手头有一点时间
-
得体的文本编辑器或 IDE
-
JDK 1.8 或更高版本(适当配置了
JAVA_HOME
)已安装
2.2 如何完成指南
要开始操作,请执行以下操作
-
下载并解压源代码
或
-
克隆 Git 存储库
git clone https://github.com/grails-guides/grails-vue-combined.git
Grails 指南存储库包含两个文件夹
-
initial
初始项目。通常是简单的 Grails 应用,其中包含一些附加代码,以便快速入门。 -
complete
已完成示例。它是完成指南介绍的步骤并在initial
文件夹应用这些更改的结果。
要完成指南,请转到initial
文件夹
-
cd
进入grails-guides/grails-vue-combined/initial
并按照后续章节中的说明进行操作。
如果你“cd”到“grails-guides/grails-vue-combined/complete”,你可以直接获取完整的示例 |
3 编写应用程序
如果你打开了本指南的“initial”项目,你会发现一个由 Vue 配置文件生成的简单项目。
“server”Grails 应用程序和“client”Vue 应用程序都设置了“production”构建任务——你可以运行“./gradlew server:assemble”来构建一个 WAR 或 JAR 文件,并且你可以运行“yarn build”(或“./gradlew client:build”)来生成一个静态 Vue/webpack 捆绑包。我们的第一步是在我们的项目结构的顶部,在“client”和“server”子项目之上新建一个“build.gradle”文件。
3.1 配置 Gradle
初始文件夹包含一个使用“vue”配置文件生成的 Grails 应用程序。该项目是一个Gradle 多项目构建。
在与“settings.gradle”同级的根项目中创建一个“build.gradle”文件。添加以下内容
task copyClientResources(dependsOn: ':client:build', type: Copy) { (1)
group = 'build'
description = 'Copy client resources into server'
from "${project(':client').projectDir}/dist"
into "${project(':server').buildDir}/resources/main/public"
}
task assembleServerAndClient(type: Copy, dependsOn: ['copyClientResources', ':server:assemble']) { (2)
group = 'build'
description = 'Build combined server & client JAR/WAR'
from fileTree(dir: "${project(':server').buildDir}/libs/") (3)
into "${rootProject.buildDir}"
doLast {
logger.quiet "JAR/WAR generated at ${rootProject.buildDir}. It combines the server and client projects."
}
}
task(":server:assemble").mustRunAfter(copyClientResources) (4)
1 | “copyClientResources”任务会将“yarn build”生成的静态文件复制到“server”项目的资源目录中。 |
2 | “assembleServerAndClient”任务将复制步骤与“server”项目的现有 Gradle “assemble”任务关联。这意味着,只有运行此顶级任务(单独运行“server:assemble”)才会获取到我们的统一存档。它会生成一个“普通”WAR/JAR 文件,但不包含客户端资源。 |
3 | 如果要执行“copyClientResources”,则它必须先于“:sever:assemble”。这可确保在组装 Grails 应用程序时客户端静态文件可用。 |
4 | 在创建了合并后的 JAR 文件之后,我们将文件复制到顶级“build”目录。 |
在本指南中,我们将使用一个可执行 JAR 文件作为我们的部署目标。为此,打开“server”项目的“build.gradle”文件并删除以下行
apply plugin:"war"
如果你希望生成一个 WAR 文件,请将“apply plugin: "war"”行留在“server/build.gradle”中。 |
3.2 更新配置
既然我们有一个统一的 Gradle 构建目标,我们还要做一些配置上的修改。这些修改全部与分开的 Grails 和 Vue 应用程序与我们新的合并部署之间的 URL 差异有关。
默认情况下,已部署的 Grails 应用程序中的静态资源会从“/static”基本 URL 提供服务。该 URL 会与 Vue 应用程序的预期相冲突,但幸运的是,这是一个非常简单的修改。
编辑“server/grails-app/conf/application.yml”
grails:
resources:
pattern: /**
这会简单地将静态资源 URL 设置为根上下文。
类似地,我们需要编辑 Vue 应用用来对 Grails 应用执行 REST 调用的 URL。可以在“client”项目中的 `client/config/prod.env.js` 中完成此操作。此文件在生产环境中使用,并将 SERVER_URL 设置为根上下文。
'use strict'
module.exports = {
NODE_ENV: '"production"',
SERVER_URL: '""'
}
3.3 URL 映射
我们的最终更改需要在 `UrlMappings.groovy` 中进行。回想一下,默认情况下 `server` Grails 应用在根上下文中呈现一些应用程序元数据。但是,为了使我们的组合构建正常工作,我们需要在根上下文中加载我们的 Vue 应用。幸运的是,这也是一个非常简单的更改。
编辑 `server/grails-app/controllers/demo/UrlMappings.groovy`
删除此行
'/'(controller: 'application', action:'index')
替换为此
if ( Environment.current == Environment.PRODUCTION ) {
'/'(uri: '/index.html')
} else {
'/'(controller: 'application', action:'index')
}
1 | 我们使用 `grails.util.Environment` 类来确定我们是在开发模式下运行还是在已部署工件中运行,并适当设置 URL 映射。 |
有了此新映射配置,当我们构建可执行 JAR 文件时,`URL` 将映射到 `/`, `/index.html` 恰巧也是我们 Vue 应用程序的着陆页。
4 运行应用程序
要生成统一的可执行 JAR 文件,只需运行以下命令
~ ./gradlew assembleServerAndClient
...
JAR generated at build. It combines the server and client projects.
要运行应用程序,请使用 `java -jar` 命令
~ java -jar build/server-0.1.jar
...
Grails application running at http://localhost:8080 in environment: production
浏览到 `http://localhost:8080`,你应该会看到 Vue 应用程序。
对 `http://localhost:8080/application/` 执行 GET 请求,你应该会看到来自 Grails 应用程序的应用程序元数据。
恭喜,你拥有了统一的 Grails/Vue 生产版本!
在开发模式下运行应用程序 |
- ./gradlew client:start - for the client Vue app
- ./gradlew server:bootRun - for the server Grails app
- ./gradlew bootRun -parallel - to launch them at the same time with one command