运行多个任务的Gradle自定义任务


80

我想同时执行多个gradle任务。所以代替

./gradlew clean build publish

我想要一个自定义任务

./gradlew cleanBuildPublish

clean build并按publish顺序执行。

那怎么可能

这行不通

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
}

您正在使用Java插件吗?
Santosh Gokak,2015年

@SantoshGokak是的,我愿意
Niklas

Answers:


111

如果需要按预定义的顺序执行某些任务,则不仅需要set dependsOn,而且还需要mustRunAfter为此任务设置属性,如以下代码所示:

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
    tasks.findByName('build').mustRunAfter 'clean'
    tasks.findByName('publish').mustRunAfter 'build'
}

dependsOn并没有定义任务执行的顺序,只是使一个任务与另一个任务相关,而mustRunAfter确实如此。


这样是否还可以仅执行任务?
尼克拉斯

15
我收到此错误Cannot invoke method mustRunAfter() on null object
Niklas 2015年

1
再有一个,您的cleanBuildPublish任务必须放置在构建脚本中的所有3个相关任务之后
Stanislav

1
确保cleanBuildPublish在定义了所有单个任务之后放置。似乎gradle任务是从上到下读取的。这解决了我的问题Cannot invoke method mustRunAfter() on null object
baskInEminence

2
重要的是要提到gradle不会等待任务完成
MontrealDevOne


3

尝试以下方式使cleanBuildPublish依赖于其他任务

build.gradle

task clean{
    println "lets clean"
}

task build {
    println "lets build"
}

task publish {
    println "lets publish"
}

task cleanBuildPublish{
    println 'lets do all'
}


cleanBuildPublish.dependsOn clean
cleanBuildPublish.dependsOn build
cleanBuildPublish.dependsOn publish

输出量

$ gradle cleanBuildPublish
lets clean
lets build
lets publish
lets do all
:build UP-TO-DATE
:clean UP-TO-DATE
:publish UP-TO-DATE
:cleanBuildPublish UP-TO-DATE

BUILD SUCCESSFUL

Total time: 2.738 secs

查看https://docs.gradle.org/current/userguide/more_about_tasks.html#addDependencyUsingTask了解更多详细信息


仍然没有。输出:pastebin.com/8knNfLEY Gradle任务pastebin.com/NaHhdRkA
Niklas

请分享您的build.gradle文件
Santosh Gokak

项目:pastebin.com/4uN9Usvd日历模块:pastebin.com/CPzYKNqx Publishing.gradle pastebin.com/XMMQUG4C
Niklas

3

如果发布任务在名为subProjectName的子项目中,

...
tasks.findByPath(':subProjectName:publish').mustRunAfter 'build'
...


0

这是我通过Kotlin脚本同时使用dependsOn和mustRunAfter来完成的。这是运行两个任务的示例,一个任务(自定义注册的“ importUnicodeFiles”任务)在“ this”项目中,另一个(预定义的“ run”任务)在同级项目“:unicode”中:

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}

Gradle开发人员通常建议不要使用这种方法(他们说强迫排序是不好的,而执行来自其他项目的任务是不好的),并且正在研究一种在项目之间发布结果的方法。请参阅:https//docs.gradle.org/current/userguide/cross_project_publications.html


-1

这是我通过Kotlin脚本同时使用dependsOn和mustRunAfter来完成的。这是运行两个任务的示例,一个任务(自定义注册的“ importUnicodeFiles”任务)在“ this”项目中,另一个(预定义的“ run”任务)在同级项目“:unicode”中:

tasks.register("rebuildUnicodeFiles") {
    description = "Force the rebuild of the `./src/main/resources/text` data"
    val make = project(":unicode").tasks["run"]
    val copy = tasks["importUnicodeFiles"]
    dependsOn(make)
    dependsOn(copy)
    copy.mustRunAfter(make)
}

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.