Gradle - 不同的任务使用不同的参数

时间:2014-02-14 08:30:35

标签: jenkins gradle

我有两个任务,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,为什么?怎么解决呢?

2 个答案:

答案 0 :(得分:2)

在配置值更改之前配置

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

答案 1 :(得分:0)

正如其他人所提到的那样,最好采用advice of @PeterNiederwieser并使用两个单独的任务,但如果你真的认为不可以,那么这里还有其他一些应该可行的选择。

1)检查Gradle startParameter

根据在命令行上传递给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)。

只有在运行gradle时在命令行上指定 task_2时,我们才将compressPng更改为0

即。 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进行检查的。