【问题标题】:Optional Gradle properties可选的 Gradle 属性
【发布时间】:2015-02-23 21:39:07
【问题描述】:

我有一个 Gradle 构建文件,其中一项任务是登录 docker。在这个任务中,我希望用户/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 任务设置可选参数,而不使该参数对任何其他任务都是必需的。

【问题讨论】:

  • 请记住,任务配置总是被评估,无论单个任务是否实际执行

标签: gradle build.gradle


【解决方案1】:

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

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

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

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

【讨论】:

  • 是的,同样的错误。 @oliver 提到了配置阶段。我想这就是线索
  • @Oliver 是正确的,这些属性在配置过程中被评估,这就是为什么如果它们没有被定义,你需要有条件地评估它们。上面的示例应该可以工作(您当然需要对所有属性都这样做)。另一种解决方案是在 gradle.properties 文件中定义默认值。通过 CLI 定义的属性将覆盖这些。
  • 我发布的代码示例正是这样做的。三元语句仅评估属性docker_username(如果存在),否则评估替代值(在本例中为字符串文字)。
  • 重要的是键 hasProperty("docker_username") 周围的引号我忘了。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    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 等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      相关资源
      最近更新 更多