我正在尝试在我的spring boot项目构建中实现一个简单的场景:包括/排除依赖项和打包war或jar,具体取决于环境。
例如,对于环境dev
包括devtools和package jar,用于prod
打包战争等。
我知道它不再是基于XML的配置了,我基本上可以在build.gradle中编写if语句但是有推荐的实现方法吗?
我可以声明一些常见的依赖项并将它们引用到一个文件中,而不是创建多个构建文件吗?
是否有基于构建目标环境更改构建配置的最佳实践?
答案 0 :(得分:14)
ext {
devDependencies = ['org.foo:dep1:1.0', 'org.foo:dep2:1.0']
prodDependencies = ['org.foo:dep3:1.0', 'org.foo:dep4:1.0']
isProd = System.properties['env'] == 'prod'
isDev = System.properties['env'] == 'dev'
}
apply plugin: 'java'
dependencies {
compile 'org.foo:common:1.0'
if (isProd) {
compile prodDependencies
}
if (isDev) {
compile devDependencies
}
}
if (isDev) tasks.withType(War).all { it.enabled = false }
答案 1 :(得分:3)
我的版本(受Lance Java's answer启发):
apply plugin: 'war'
ext {
devDependencies = {
compile 'org.foo:dep1:1.0', {
exclude module: 'submodule'
}
runtime 'org.foo:dep2:1.0'
}
prodDependencies = {
compile 'org.foo:dep1:1.1'
}
commonDependencies = {
compileOnly 'javax.servlet:javax.servlet-api:3.0.1'
}
env = findProperty('env') ?: 'dev'
}
dependencies project."${env}Dependencies"
dependencies project.commonDependencies
if (env == 'dev') {
war.enabled = false
}
答案 2 :(得分:0)
有时,通过向文件settings.gradle
添加一些代码行来在不同的构建文件之间完全切换也很有用。此解决方案读取环境变量BUILD_PROFILE
并将其插入buildFileName
中:
# File: settings.gradle
println "> Processing settings.gradle"
def buildProfile = System.getenv("BUILD_PROFILE")
if(buildProfile != null) {
println "> Build profile: $buildProfile"
rootProject.buildFileName = "build-${buildProfile}.gradle"
}
println "> Build file: $rootProject.buildFileName"
然后您像这样运行gradle使用build-local.gradle
:
$ BUILD_PROFILE="local" gradle compileJava
> Processing settings.gradle
> Build profile: local
> Build file: build-local.gradle
BUILD SUCCESSFUL in 3s
这种方法也适用于CI / CD管道,您可能希望在其中添加其他任务,例如检查质量门或其他您不想在本地执行的耗时的事情。