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

时间:2016-11-15 14:43:48

标签: 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中,这是小菜一碟:

<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

哪个也不理想。

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

4 个答案:

答案 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') { ... }

请参阅adding dependencies to tasks

答案 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)

它工作正常,但是由于在此版本中使用了不推荐使用的Gradle功能,因此发出了警告,使其与Gradle 5.0不兼容。

enter imagGradleription here

我正在使用Gradle 4.7版。因此,这意味着您在build.gradle中添加的某些功能将无法在gradle 5.0中使用。

使用命令行参数--warning-mode = all运行Gradle构建,以查看确切不赞成使用的功能。

它将通过Gradle文档的链接为您找到已发现的问题的详细说明,以指示如何修复构建。