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

Nik*_*las 68 gradle

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

./gradlew clean build publish
Run Code Online (Sandbox Code Playgroud)

我想要一个自定义任务

./gradlew cleanBuildPublish
Run Code Online (Sandbox Code Playgroud)

执行clean buildpublish按顺序.

怎么可能?

这不起作用

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
}
Run Code Online (Sandbox Code Playgroud)

Sta*_*lav 86

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

task cleanBuildPublish {
    dependsOn 'clean'
    dependsOn 'build'
    dependsOn 'publish'
    tasks.findByName('build').mustRunAfter 'clean'
    tasks.findByName('publish').mustRunAfter 'build'
}
Run Code Online (Sandbox Code Playgroud)

dependsOn没有定义任务执行的顺序,它只是使一个任务依赖于另一个任务,而mustRunAfter确实如此.

  • 我得到这个错误`无法在null对象上调用方法mustRunAfter() (9认同)
  • 为什么 Gradle 让执行这样一个简单而常见的操作变得如此尴尬?有计划改进这一点吗? (7认同)
  • Gradle 语法不断变化,这不是很奇妙吗?现在它是:`task cleanBuildPublish(dependOn: [clean, build,publish])`然后是`build.mustRunAfter clean`等。AFAICS (3认同)
  • 另外,您的 cleanBuildPublish 任务必须放在构建脚本中的所有 3 个相关任务之后 (2认同)
  • 值得一提的是 gradle 不会等待任务完成 (2认同)

tas*_*iac 78

您还可以使用调用的任务库类 GradleBuild

在这里你可以用它来做到这一点 GradleBuild

task cleanBuildPublish(type: GradleBuild) {
     tasks = ['clean', 'build', 'publish']
}
Run Code Online (Sandbox Code Playgroud)

  • 那么任务会按照提到的顺序执行吗? (2认同)
  • Gradle项目特别建议不要这样做:https://docs.gradle.org/current/userguide/authoring_maintainable_build_scripts.html#sec:avoiding_use_of_gradlebuild (2认同)

San*_*kak 6

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

构建.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
Run Code Online (Sandbox Code Playgroud)

输出

$ 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
Run Code Online (Sandbox Code Playgroud)

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


Cod*_*dev 6

我的方法是

task cleanBuildPublish (type: GradleBuild, dependsOn: ['clean', 'build', 'publish']) { 
}
Run Code Online (Sandbox Code Playgroud)

这对我有用。

  • Gradle 项目特别建议不要这样做:https://docs.gradle.org/current/userguide/authoring_maintainable_build_scripts.html#sec:avoiding_use_of_gradlebuild (4认同)