我有两个任务,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,为什么?怎么解决呢?
答案 0 :(得分:2)
taskCompressPngs
。条件配置很少是一个很好的解决方案。更好的方法是声明两个Exec
任务。
答案 1 :(得分:0)
正如其他人所提到的那样,最好采用advice of @PeterNiederwieser并使用两个单独的任务,但如果你真的认为不可以,那么这里还有其他一些应该可行的选择。
根据在命令行上传递给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”时,这才有效。
您可以编写自定义任务并检查其中的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进行检查的。