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

Gradle run task only on defined property

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

我正在使用 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.

不,任务没有运行。您需要区分 配置阶段 执行阶段 。设置任务属性的任务闭包在 配置阶段 期间执行,紧接在创建任务之后。在 执行阶段 .

期间,仅执行通过 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
}