我正在使用Gradle。我有两个任务:" a"和" b"。我想要任务" a"打电话给任务" b"。我怎么能这样做?
task b(type: Exec) {
description "Task B"
commandLine 'echo', 'task-b'
}
task a(type: Exec) {
description "Task A"
commandLine 'echo', 'task-a'
// TODO: run task b
}
在Ant中,这是小菜一碟:
<target name="a">
<echo message="task-a"/>
<antcall target="b"/>
</target>
<target name="b">
<echo message="task-b"/>
</target>
我尝试的第一种方法是使用&#34; dependsOn&#34;特征。然而,这并不理想,因为我们需要反过来考虑所有任务,还有其他几个问题(比如满足条件时运行任务)。
我尝试的另一种方法是:
b.mustRunAfter(a)
但是,只有当我像这样运行gradle任务时,这才有效:
gradle -q a b
哪个也不理想。
无论如何只是从现有任务中调用另一个任务?
答案 0 :(得分:15)
正如所建议的那样,一种方法是为任务添加终结器
task beta << {
println 'Hello from beta'
}
task alpha << {
println "Hello from alpha"
}
// some condition
if (project.hasProperty("doBeta")) {
alpha.finalizedBy beta
}
然后我们可以根据需要执行其他任务。至于从其他任务执行任务,你不能这样做。任务声明声明不是必要的。所以任务可以依赖于另一个任务,但是他们不能执行另一个任务。
$ gradle -q alpha
Hello from alpha
$ gradle -q alpha -PdoBeta
Hello from alpha
Hello from beta
答案 1 :(得分:11)
您可以使用
a.dependsOn 'b'
或者
a.dependsOn b
或者
task a(type: Exec, dependsOn: 'b') { ... }
等
答案 2 :(得分:11)
总结并整合@JBirdVegas和@ lance-java的答案,使用未弃用的doLast
代替leftShift(<<
):
task beta {
doLast {
println 'Hello from beta'
}
}
task alpha {
doLast {
println 'Hello from alpha'
}
}
// some condition
if (project.hasProperty('doBeta')) {
alpha.finalizedBy beta // run 'beta' after 'alpha'
// or
// alpha.dependsOn beta // run 'beta' before 'alpha'
}
答案 3 :(得分:1)