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

从gradle中的任务调用另一个任务,gradle,build.gradle,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 } 在Ant中,这是小菜一碟: &

我在用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>
但是,这仅在我运行gradle任务时有效,如下所示:

gradle -q a b
这也不理想


是否可以直接从现有任务调用另一个任务?

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

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

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

// some condition
if (project.hasProperty("doBeta")) {
    alpha.finalizedBy beta
}
你可以用

a.dependsOn 'b'


请参见

以总结并合并@JBirdVegas和@lance java的答案,使用非弃用的
doLast
而不是leftShift(
它工作正常,但提供了一个警告,因为此版本中使用了弃用的Gradle功能,使其与Gradle 5.0不兼容

我使用的是gradle版本4.7。因此,这意味着您在build.gradle中添加的一些功能将无法像在gradle 5.0中那样工作

使用命令行参数--warning mode=all运行Gradle构建,查看不推荐使用的功能的确切内容


它将为您提供所发现问题的详细描述,并提供指向Gradle文档的链接,以了解如何修复您的构建。

关于终结器任务,这里的答案非常好:
$ gradle -q alpha
Hello from alpha
$ gradle -q alpha -PdoBeta
Hello from alpha
Hello from beta
a.dependsOn 'b'
a.dependsOn b
task a(type: Exec, dependsOn: 'b') { ... }
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'
}