从gradle中的任务调用另一个任务

Yah*_*din 26 gradle build.gradle

我正在使用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
}
Run Code Online (Sandbox Code Playgroud)

在Ant中,这是小菜一碟:

<target name="a">
    <echo message="task-a"/>
    <antcall target="b"/>
</target>
<target name="b">
    <echo message="task-b"/>
</target>
Run Code Online (Sandbox Code Playgroud)

我尝试的第一种方法是使用"dependsOn"功能.然而,这并不理想,因为我们需要反过来考虑所有任务,还有其他几个问题(比如满足条件时运行任务).

我尝试的另一种方法是:

b.mustRunAfter(a)
Run Code Online (Sandbox Code Playgroud)

但是这只有在我运行这样的gradle任务时才有效:

gradle -q a b
Run Code Online (Sandbox Code Playgroud)

哪个也不理想.

无论如何只是从现有任务中调用另一个任务?

JBi*_*gas 18

如建议的那样,一种方法是为任务添加终结器

task beta << {
    println 'Hello from beta'
}

task alpha << {
    println "Hello from alpha"
}

// some condition
if (project.hasProperty("doBeta")) {
    alpha.finalizedBy beta
}
Run Code Online (Sandbox Code Playgroud)

然后我们可以根据需要执行其他任务.至于从其他任务执行任务,你不能这样做.任务声明声明不是必要的.因此,任务可以依赖于另一个任务,但是它们不能执行另一个任务.

$ gradle -q alpha
Hello from alpha
$ gradle -q alpha -PdoBeta
Hello from alpha
Hello from beta
Run Code Online (Sandbox Code Playgroud)


fri*_*mle 15

总结和组合来自@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'
}
Run Code Online (Sandbox Code Playgroud)


lan*_*ava 14

您可以使用

a.dependsOn 'b'
Run Code Online (Sandbox Code Playgroud)

要么

a.dependsOn b
Run Code Online (Sandbox Code Playgroud)

要么

task a(type: Exec, dependsOn: 'b') { ... }
Run Code Online (Sandbox Code Playgroud)

等等

请参阅向任务添加依赖项