我正在尝试创建一个 Gradle 构建脚本来构建 Java.jar
文件处于“发布”或“调试”模式,并且在参数化脚本时遇到问题。
问题是:使用 Java 插件在 Gradle 脚本中执行此操作的惯用方法是什么?(或者,如果没有惯用的方法,那么真正有效的解决方案是什么?)
我不介意参数化的方法,只要命令行和 IDE 调用可以轻松地在两个输出选项之间进行选择即可。 jar 文件将在其他项目中用作库,例如一个 Android 应用程序和一个 JavaFX 应用程序,所以我希望参数化方法可以从它们自己的 Gradle 脚本中调用/依赖。
理想情况下,我想“模拟”Android gradle 插件为每个任务提供调试/发布版本的能力,即
$ ./gradlew build
$ ./gradlew assembleRelease
$ ./gradlew checkDebug
但如果失败的话,即使是顶级的 buildDebug 和 buildRelease 也是合适的。
我尝试过的东西
这部分与问题并不真正相关。
初始点
我有以下 gradle 文件/项目:
group 'TestGradleProjectGroup'
apply plugin: 'java'
sourceCompatibility = 1.8
version '1.0-release'
compileJava {
options.debug = false
}
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
}
这工作正常并生成 jar 文件:
$ ls TestGradleModule/build/libs/
TestGradleModule-1.0-release.jar
当使用检查提取的类时javap
,不包含任何调试信息。欢呼。不,我们需要一种方法来制作调试版本。
添加调试和发布任务
version '1.0-release'
compileJava {
options.debug = false
}
task buildRelease(type: GradleBuild, dependsOn: build) {
project.version = '1.0-release'
compileJava {
options.debug = false
}
}
task buildDebug(type: GradleBuild, dependsOn: build) {
project.version = '1.0-debug'
compileJava {
options.debug = true
}
}
这不起作用,因为调试项目总是被构建,即使 buildRelease 是命令行上给出的任务。我想这是因为这两个任务的代码都是在配置时运行的(Gradle 构建生命周期 https://docs.gradle.org/current/userguide/build_lifecycle.html),而我只想运行一个。所以我想我想在执行时运行它们?
添加一些 doLast 任务
version '1.0-release'
compileJava {
options.debug = false
}
task buildRelease(type: GradleBuild, dependsOn: build) {
doLast {
project.version = '1.0-release'
compileJava {
options.debug = false
}
}
}
task buildDebug(type: GradleBuild, dependsOn: build) {
doLast {
project.version = '1.0-debug'
compileJava {
options.debug = true
}
}
}
这更糟糕。输出文件始终是 1.0 版本,这是因为顶层的“默认”。如果我注释掉,则不会创建版本化的 jar,而是默认的TestGradleModule.jar
被制成。看起来 doLast 块的内容对compileJava 任务的影响是完全无用的(但是没有关于这一点的警告?)。我想这些修改太晚了,无法在执行时完成,或者还需要做其他事情,以便以不同的方式“配置”compileJava 任务?
使用配置?
我注意到手册Java 插件 https://docs.gradle.org/current/userguide/java_plugin.html包含对buildConfigName
and uploadConfigName
,并声称它们依赖于“在配置 ConfigName 中生成工件的任务。”。鉴于我未能在配置时对内容进行参数化,该插件的能力看起来很有希望:
group 'TestGradleProjectGroup'
apply plugin: 'java'
sourceCompatibility = 1.8
configurations {
debug
release
}
version '1.0-release'
compileJava {
options.debug = false
}
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.11'
}
but:
- 这个没加
buildRelease
or buildDebug
的输出./gradlew tasks --all
,正如我所料。但我可以运行这些任务。
- 这似乎只是让
buildRelease
and buildDebug
,不是例如assembleRelease
etc
-
buildRelease
运行时似乎不依赖任何东西,因此没有任何有用的效果。
迭代任务?
作为最后的尝试,我尝试创建所有适当的任务并链接所有内容的依赖项。我尝试迭代任务并添加依赖项:
gradle.taskGraph.whenReady { taskGraph ->
taskGraph.allTasks.each { taskIter ->
println("iterating" + taskIter)
def releaseTask = project.task(taskIter.name + "Release")
def debugTask = project.task(taskIter.name + "Debug")
taskIter.dependsOn += [releaseTask, debugTask].toSet()
println("new taskIter.dependsOn:" + taskIter.dependsOn)
/*
set debug mode here,
copy over effects of task to debug/release
disable effects of task
*/
}
}
but
- 这似乎没有正确创建任务,无法从命令行访问它们,并且运行“build”没有运行“buildRelease”等。
- 我还必须将所有“操作”从当前现有任务“移动”到调试和发布任务中,以避免重复每个任务的效果。我不知道该怎么做。
简而言之,我不知道自己在做什么。作为最后的手段,我可以手动创建所有任务,但这似乎违背了使用 java 插件的目的,并且非常垃圾邮件?