仅在已定义的属性上执行Gradle运行任务

时间:2017-04-21 21:48:17

标签: if-statement gradle groovy conditional gradlew

我正在努力让任务仅在定义特定值时执行。

我正在使用Gradle 3.5。

Could not get unknown property 'keyStore' for root project 'JustAnotherEnergy' of type org.gradle.api.Project.

如您所见,我已经尝试过onlyIf语句,但任务仍在运行。这导致崩溃:

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 '没有定义,但代码被执行。

{{1}}

这很有效。代码没有被执行,但我遇到了其他问题: 如果属性' mod_keystore '未定义,Gradle无法为例如' keyStore '设置值。属性,但任务SignJar需要设置此值。

这意味着只有在属性' mod_keystore '被定义为。如果未定义,则应跳过该任务。

1 个答案:

答案 0 :(得分:4)

  

如您所见,我已经尝试过onlyIf语句,但任务仍在运行。

不,任务没有运行。您需要区分配置阶段执行阶段。您正在设置任务属性的任务关闭在配置阶段期间,在创建任务后立即执行。在执行阶段期间,仅执行通过doFirstdoLast添加的任务操作(由任务类型定义)和闭包。

如果您通过onlyIfenabled禁用或跳过任务,则只会禁用/跳过任务的执行(阶段),而不是配置(相位)

作为针对特定问题的解决方案,您可以依靠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
}