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

时间:2015-10-02 12:33:50

标签: gradle

我想把多个gradle任务作为一个来运行。而不是

./gradlew clean build publish

我想要一个自定义任务

./gradlew cleanBuildPublish

按顺序执行clean buildpublish

怎么可能?

这不起作用

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

10 个答案:

答案 0 :(得分:75)

如果您需要按预定义的顺序执行某些任务,那么您不仅需要设置dependsOn,还需要为此任务设置mustRunAfter属性,如下面的代码所示:

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

dependsOn没有定义任务执行的顺序,只是让一个任务依赖于另一个任务,而mustRunAfter则执行。

答案 1 :(得分:67)

您还可以使用名为GradleBuild

的任务库类

在这里,您可以使用GradleBuild

执行此操作
task cleanBuildPublish(type: GradleBuild) {
     tasks = ['clean', 'build', 'publish']
}

答案 2 :(得分:2)

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

的build.gradle

Activity

输出

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

检查https://docs.gradle.org/current/userguide/more_about_tasks.html#addDependencyUsingTask了解详情

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

我的方法是

task cleanBuildPublish (type: GradleBuild, dependsOn: ['clean', 'build', 'publish']) { 
}

这对我有用。

答案 5 :(得分:1)

获取它的通用方法如下:

task cleanBuildPublish {
  def containedTasks = [clean, build, publish]
  dependsOn containedTasks
  placeTasksInOrder(containedTasks)
}

def placeTasksInOrder(List tasks) {
  for (int i=0; i < tasks.size() -1; i++) {
    def earlierTask = tasks.get(i)
    def laterTask   = tasks.get(i +1)
    laterTask.mustRunAfter(earlierTask)
  }
}

dependsOn 导致其他任务在运行 cleanBuildPublish 时运行,并且辅助函数 placeTasksInOrder 通过调用 mustRunAfter

将任务按顺序排列

执行 gradlew cleanBuildPublish somethingElse 时,订单为 clean, build, publish, somethingElse


当心
如果您有嵌套的 gradle 调用

,则以下解决方案无效
task cleanBuildPublish(type: GradleBuild) {
     tasks = ['clean', 'build', 'publish']
}

执行 gradlew cleanBuildPublish somethingElse 时,可能会先调用 somethingElse
所以最好使用mustRunAfter配置。

答案 6 :(得分: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

答案 7 :(得分:0)

我的解决方案如下,它对我有用。

task cleanBuildPublish {

    task _clean {
        dependsOn 'clean'
    }

    task _build {
        dependsOn '_clean'
        dependsOn 'build'
    }

    dependsOn '_build'
    dependsOn 'publish'
}

答案 8 :(得分:-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)
}

答案 9 :(得分:-3)

尝试在build.gradle中添加defaultTasks。例如。 defaultTasks 'clean', 'build', 'publish'