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

Sha*_*gon 2 groovy conditional if-statement gradle gradlew

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

我正在使用 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
}
Run Code Online (Sandbox Code Playgroud)

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

Could not get unknown property 'keyStore' for root project 'JustAnotherEnergy' of type org.gradle.api.Project.
Run Code Online (Sandbox Code Playgroud)

属性 ' mod_keystore ' 没有定义,但代码 get 被执行。

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

这意味着只有在定义了属性“ mod_keystore ”时才应执行此任务。如果未定义,则应跳过该任务。

Luk*_*fer 5

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

不,任务没有运行。您需要区分配置阶段执行阶段。任务闭包,您在其中设置任务属性,在配置阶段执行,在任务创建后立即执行。在执行阶段仅执行通过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
}
Run Code Online (Sandbox Code Playgroud)