【问题标题】:Gradle - different task use different parameterGradle - 不同的任务使用不同的参数
【发布时间】:2014-02-14 08:30:35
【问题描述】:

我有两个任务,task_1应该压缩png文件,task_2不应该压缩png文件,所以我想添加一个参数来控制它。

project.ext.set("compressPngs",  1);
task taskCompressPngs(type:Exec){
    commandLine "myshell.sh"
    args compressPngs
}

task task_1(dependsOn:'taskCompressPngs'){}
task task_2(dependsOn:'taskCompressPngs'){}

gradle.taskGraph.whenReady { taskGraph ->
    if (taskGraph.hasTask(task_1)) 
    {
        compressPngs=1
    }
    if (taskGraph.hasTask(task_2)) 
    {
        compressPngs=0
    }
}

但是当我运行 task_1 或 task_2 时,在任务 'taskCompressPngs' 中,传递给我的脚本 'myshell.sh' 的 'compressPngs' 总是为 1,为什么?如何解决?

【问题讨论】:

  • 为什么task_2在不应该压缩的时候依赖于taskCompressPngs?
  • 整个任务图是:task_2(task_1) -> task 'osbuild' -> sign -> package -> taskCompressPngs,'->' 表示依赖。我只是希望任务图清晰。
  • 也许在 doLast{} 中移动 'args compressPngs' 可以解决问题。这样它是在 配置之后设置的。但正如聪明的@PeterNiederwieser 所说;条件配置很少是一个好的解决方案。
  • 我听从 Peter N 的建议,但如果您坚持尝试以下链接,可能会有用 - stackoverflow.com/questions/10554950/…
  • 我试过了,但对我不起作用。

标签: jenkins gradle


【解决方案1】:

taskCompressPngs 在配置值更改之前被配置。条件配置很少是一个好的解决方案。更好的方法是声明两个Exec 任务。

【讨论】:

    【解决方案2】:

    正如其他人所提到的,最好使用advice of @PeterNiederwieser 并使用两个单独的任务,但如果你真的认为你不能,这里有几个其他的选项应该可以工作。

    1) 检查 Gradle 启动参数

    根据在命令行上传递给 gradle 的任务配置您的可重用任务。

    task taskCompressPngs(type: Exec) {
        def compressPngs = 1
        if(gradle.startParameter.taskNames.toString().toLowerCase().contains("task_2")) compressPngs = 0
        commandLine "myshell.sh $compressPngs".tokenize()
    }
    

    这为您提供了一个在配置时可用的变量 (gradle.startParameter.taskNames)。

    这里我们将 compressPngs 更改为 0仅当在运行 gradle 时在命令行中指定了 task_2。

    I.E. gradlew task_1 将运行myshell.sh 1,但gradlew task_2(甚至gradlew task_1 task_2)将运行myshell.sh 0

    此逻辑也可以应用于 taskCompressPngs 任务之外的项目属性 - 例如,如果您也想更改其他任务。

    同样,这仅在用于运行 gradle 的命令中指定了“task_2”时才有效。

    2) 使用 DefaultExecAction 代替 Exec 任务

    您可以编写自定义任务并检查其中的 taskGraph,而不是使用 Exec 类型的任务。

    task taskCompressPngs << {
        def compressPngs = 1
        if(gradle.taskGraph.hasTask(two)) compressPngs = 2
        org.gradle.process.internal.DefaultExecAction e = new org.gradle.process.internal.DefaultExecAction(getServices().get(org.gradle.api.internal.file.FileResolver.class))
        e.commandLine("myshell.sh $compressPngs".tokenize())
        e.execute()
    }
    

    这只是将您现有的逻辑从配置时转移到执行时。

    这需要使用“内部”Gradle 类(这很糟糕),但它在 shell 命令的运行方式/时间方面为您提供了更多的灵活性。

    请注意,这些解决方案已针对 Gradle 1.7 和 Gradle 1.11 进行了检查。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 1970-01-01
      相关资源
      最近更新 更多