Gradle 子项目排序并生成jar (spring boot + angular)
Gradle subproject ordering and generate jar (spring boot + angular)
我是 Gradle 新手。我有以下项目设置:
根目录
- 核心:包含spring引导2应用程序
- ui: angular 5个前端应用
目标:我想从我的根文件夹 运行 'gradle build' 并且它应该包含一个包含 Angular 应用程序的 jar 文件。
我得到了 'ui' 覆盖:
apply plugin: "com.moowork.node"
buildscript {
repositories globalRepositories
dependencies {
classpath "com.moowork.gradle:gradle-node-plugin:1.2.0"
}
}
node {
// based on current version of Angular 5
version = "8.9.1"
npmVersion = "5.6.0"
download = true
}
task buildAngular(type: NpmTask) {
args = ['run', 'build']
}
buildAngular.dependsOn(npm_install)
build.dependsOn(buildAngular)
以上gradle定义将在静态后端核心应用程序中生成uild并生成Angular文件。
'core' gradle build 文件看起来像这样(我排除了依赖项),没什么特别的:
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'xxx.xxxxxx'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
targetCompatibility = 1.8
buildscript {
repositories globalRepositories
ext {
springBootVersion = '2.0.0.M7'
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
jar {
baseName = 'spring-boot-angular'
version = '1.0.0'
}
我怎样才能做到这一点?当我从我的根项目 运行 'gradle build' 时,我希望触发以下操作:
- 运行 第一个 'gradle build' 在 ui
- 然后第二个 运行 'gradle build' 在核心
- 使用'core'生成的jar文件作为最终结果
我受不了像 groovy 这样的语法,等不及 Gradle Kotlin DSL 成熟了 :P
希望有人能提供帮助。当我准备好这个设置时,我将开源这个设置(连同 Spring 5、Hibernate 5 和 flyway)。提前致谢。
您需要在后端(核心)build:[=12 生成的 jar 中包含前端 (ui) buildAngular 任务的结果=]
bootJar {
dependsOn ':ui:buildAngular'
into('BOOT-INF/classes/static') {
from "${project(':ui').projectDir}/dist"
}
}
bootJar 任务现在依赖于前端的 buildAngular 任务这一事实将使 gradle 根据需要对其进行排序。
您可以浏览 this project of mine 以获取使用基本相同设置的示例(除了它使用 yarn 而不是 npm 来解决依赖关系)
JB Nizet 的答案应该有效。您还可以在根 gradle 文件中添加以下内容:
build.dependsOn("core:build").mustRunAfter("ui:build")
以上回答在我看来比较干净。
我是 Gradle 新手。我有以下项目设置:
根目录
- 核心:包含spring引导2应用程序
- ui: angular 5个前端应用
目标:我想从我的根文件夹 运行 'gradle build' 并且它应该包含一个包含 Angular 应用程序的 jar 文件。
我得到了 'ui' 覆盖:
apply plugin: "com.moowork.node"
buildscript {
repositories globalRepositories
dependencies {
classpath "com.moowork.gradle:gradle-node-plugin:1.2.0"
}
}
node {
// based on current version of Angular 5
version = "8.9.1"
npmVersion = "5.6.0"
download = true
}
task buildAngular(type: NpmTask) {
args = ['run', 'build']
}
buildAngular.dependsOn(npm_install)
build.dependsOn(buildAngular)
以上gradle定义将在静态后端核心应用程序中生成uild并生成Angular文件。
'core' gradle build 文件看起来像这样(我排除了依赖项),没什么特别的:
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'xxx.xxxxxx'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8
targetCompatibility = 1.8
buildscript {
repositories globalRepositories
ext {
springBootVersion = '2.0.0.M7'
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
jar {
baseName = 'spring-boot-angular'
version = '1.0.0'
}
我怎样才能做到这一点?当我从我的根项目 运行 'gradle build' 时,我希望触发以下操作:
- 运行 第一个 'gradle build' 在 ui
- 然后第二个 运行 'gradle build' 在核心
- 使用'core'生成的jar文件作为最终结果
我受不了像 groovy 这样的语法,等不及 Gradle Kotlin DSL 成熟了 :P
希望有人能提供帮助。当我准备好这个设置时,我将开源这个设置(连同 Spring 5、Hibernate 5 和 flyway)。提前致谢。
您需要在后端(核心)build:[=12 生成的 jar 中包含前端 (ui) buildAngular 任务的结果=]
bootJar {
dependsOn ':ui:buildAngular'
into('BOOT-INF/classes/static') {
from "${project(':ui').projectDir}/dist"
}
}
bootJar 任务现在依赖于前端的 buildAngular 任务这一事实将使 gradle 根据需要对其进行排序。
您可以浏览 this project of mine 以获取使用基本相同设置的示例(除了它使用 yarn 而不是 npm 来解决依赖关系)
JB Nizet 的答案应该有效。您还可以在根 gradle 文件中添加以下内容:
build.dependsOn("core:build").mustRunAfter("ui:build")
以上回答在我看来比较干净。