可选的Gradle属性

时间:2014-12-26 16:23:33

标签: gradle build.gradle

我有一个Gradle构建文件,其中一个任务是登录docker。在此任务中,我希望user / CI提供参数docker_username,docker_password和docker_email。

task loginDockerHub(group: "Docker",  type:Exec) {        
    executable "docker"
    args "login","-u", docker_username, "-p", docker_password, "-e", docker_email
}

执行gradle loginDockerHub -Pdocker_username=vad1mo ... all正在按预期工作。

但是当我执行例如gradle build时,我收到错误:

  

无法在任务':loginDockerHub'上找到属性'docker_username'。

我希望在不提供-P参数的情况下执行gradle loginDockerHub时会出现此错误,但对于不访问docker_username / password参数的其他任务则不会。

如何在Gradle中为loginDockerHub任务提供可选参数,这些参数不会使参数成为任何其他任务的必需参数。

3 个答案:

答案 0 :(得分:12)

您可以检查属性是否存在,如果不是,则返回默认值。

args "login", "-u", project.hasProperty("docker_username") ? docker_username : ""

更新:从Gradle 2.13开始,您可以稍微简化一下。

args "login", "-u", project.findProperty("docker_username") ?: ""

答案 1 :(得分:4)

我无法找到问题的解决方案。 This description提示有关在任务中声明操作的提示。将shell exec放入action任务具有我期望的行为,因为在任务执行时会评估操作。

task loginDockerHub(group: "Docker",  type:Exec) {
    doFirst{
        executable "docker"
        args "login","-u", docker_username, "-p", docker_password, "-e", docker_email
    }
}

在不提供loginDockerHub参数的情况下执行docker_*会出错。执行任何其他任务将按预期工作。

答案 2 :(得分:0)

我必须这样做,并且不希望我的构建因错误而失败。我解决了这个问题:

ext.shouldLoginDockerHub = project.hasProperty("docker_username");

task loginDockerHub(group: "Docker") {
    doLast{
        if(shouldLoginDockerHub) {
            exec {
                executable "docker"
                args "login","-u", docker_username, "-p", docker_password, "-e", docker_email
            }
        } else {
            println "Not logging in to docker hub because docker_username was not provided.";
        }
    }
 }

您可以扩展第一行以查找docker_password,docker_email等。