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

63

我正在使用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>

我尝试的第一种方法是使用“dependsOn”功能。但这不是理想的,因为我们需要倒过来考虑所有任务,并且还有几个其他问题(例如在条件满足时运行任务)。

我尝试的另一种方法是:

b.mustRunAfter(a)

然而,这只有在我像这样运行Gradle任务时才有效:

gradle -q a b

这也不是最理想的情况。

有没有办法从现有任务中简单地调用另一个任务?


2
终止任务怎么样?https://docs.gradle.org/current/userguide/more_about_tasks.html#sec:finalizer_tasks - AdamSkywalker
这里的答案相当不错:https://dev59.com/Imox5IYBdhLWcg3ww3KV#13868051 - Ryan Shillington
4个回答

47

建议的一种方法是为任务添加一个finalizer。

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

27

您可以使用

a.dependsOn 'b'

或者

a.dependsOn b

或者

task a(type: Exec, dependsOn: 'b') { ... }

请参考 添加依赖项到任务

22

总结来自@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'
}

2

它能正常工作,但提供了一个警告:在此构建中使用了已弃用的Gradle功能,使其与Gradle 5.0不兼容。

在这里输入图片描述

我正在使用Gradle版本4.7。这意味着您在build.gradle中添加的一些功能将无法按原样在Gradle 5.0中运行。

使用命令行参数--warning-mode=all运行Gradle build,以查看哪些已弃用的功能。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接