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

标签 if-statement gradle groovy conditional-statements 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
}

如您所见,我已经尝试了 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
}

关于if-statement - Gradle 仅在定义的属性上运行任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43552501/

相关文章:

python - 包括它将在 python 中的一个 if 语句中检查的两件事

javascript - 条件语句返回输入框中的值

android - 在APK中包含文件

javascript - 如何通过图像查找元素

grails - 带有枚举的Grails JSON单元格

管道脚本中的 java.io.NotSerializedException 错误

r - 根据另一列中的4个值创建新列

c# - 在两个碰撞器接触的每一帧上运行代码

Android Studio Gradle Sync 添加参数

gradle - 将环境变量传递给 gradle.properties