我想把多个gradle任务作为一个来运行。而不是
./gradlew clean build publish
我想要一个自定义任务
./gradlew cleanBuildPublish
按顺序执行clean
build
和publish
。
怎么可能?
这不起作用
task cleanBuildPublish {
dependsOn 'clean'
dependsOn 'build'
dependsOn 'publish'
}
答案 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'