我正在努力让任务仅在定义特定值时执行。
我正在使用 Gradle 3.5。
task signJar(type: SignJar, dependsOn: reobfJar) {
onlyIf {
project.hasProperty('mod_keystore')
}
keyStore = project.keyStore
alias = project.keyStoreAlias
storePass = project.keyStorePass
keyPass = project.keyStoreKeyPass
inputFile = jar.archivePath
outputFile = jar.archivePath
}
如您所见,我已经尝试了 onlyIf 语句,但任务仍在运行。这会导致崩溃:
Could not get unknown property 'keyStore' for root project 'JustAnotherEnergy' of type org.gradle.api.Project.
属性“mod_keystore”未定义,但代码已执行。
task signJar(type: SignJar, dependsOn: reobfJar) {
if(project.hasProperty('mod_keystore')) {
keyStore = project.keyStore
alias = project.keyStoreAlias
storePass = project.keyStorePass
keyPass = project.keyStoreKeyPass
inputFile = jar.archivePath
outputFile = jar.archivePath
}
}
这行得通。代码没有得到执行,但我遇到了其他问题: 如果未定义属性“mod_keystore”,Gradle 无法为例如“keyStore”属性设置值,但任务 SignJar 需要设置此值.
这意味着只有在定义了属性“mod_keystore”时才能执行此任务。如果未定义,则应跳过该任务。
最佳答案
As you can see, I already tried the onlyIf statement, but the task still runs.
不,任务没有运行。您需要区分配置阶段 和执行阶段。您设置任务属性的任务闭包在任务创建后的配置阶段执行。只有任务操作(由任务类型定义)和通过 doFirst
或 doLast
添加的闭包在执行阶段 执行。
如果您通过 onlyIf
或 enabled
禁用或跳过任务,您只会禁用/跳过任务的执行(阶段),不是它的配置(阶段)。
作为针对您的特定问题的解决方案,您可以依赖第一种使用 onlyIf
条件的方法,但添加一种故障安全方式来访问您的项目属性:
task signJar(type: SignJar, dependsOn: reobfJar) {
onlyIf {
hasProperty('mod_keystore')
}
keyStore = findProperty('keyStore')
alias = findProperty('keyStoreAlias')
storePass = findProperty('keyStorePass')
keyPass = findProperty('keyStoreKeyPass')
inputFile = jar.archivePath
outputFile = jar.archivePath
}
关于if-statement - Gradle 仅在定义的属性上运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43552501/