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

Gradle 运行多个任务的渐变自定义任务,gradle,Gradle,我想将多个gradle任务作为一个运行。所以不是 ./gradlew clean build publish 我想要一个自定义任务 ./gradlew cleanBuildPublish 按顺序执行cleanbuild和publish 怎么可能呢 这行不通 task cleanBuildPublish { dependsOn 'clean' dependsOn 'build' dependsOn 'publish' } 尝试以下方法使cleanBuildPublis

我想将多个gradle任务作为一个运行。所以不是

./gradlew clean build publish
我想要一个自定义任务

./gradlew cleanBuildPublish
按顺序执行
clean
build
publish

怎么可能呢

这行不通

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

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

格雷德尔先生

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

检查更多详细信息

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

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

dependsOn
没有定义任务执行的顺序,它只是使一个任务依赖于另一个任务,而
必须在
之后运行

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

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

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

您还可以使用名为

下面是如何使用
GradleBuild

task cleanBuildPublish(type: GradleBuild) {
     tasks = ['clean', 'build', 'publish']
}
我的方法是

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

这对我来说很有用。

下面是我如何使用Kotlin脚本,同时使用dependsOn和mustRunAfter实现的。下面是一个运行两个任务的示例,一个(自定义注册的“ImportionCodeFiles”任务)位于“此”项目中,另一个(预定义的“运行”任务)位于名为:unicode的同级项目中:

task cleanBuildPublish {

    task _clean {
        dependsOn 'clean'
    }

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

    dependsOn '_build'
    dependsOn 'publish'
}

Gradle开发人员通常反对这种方法(他们说强制排序是不好的,从其他项目执行任务是不好的),并且正在研究一种在项目之间发布结果的方法;请参阅:

获取它的一般方法如下:

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)
  }
}
执行
gradlew cleanBuildPublish somethingElse
时,可能会首先调用
somethingElse


因此,最好使用
mustRunAfter
配置。

我的解决方案如下,它适合我

task cleanBuildPublish {

    task _clean {
        dependsOn 'clean'
    }

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

    dependsOn '_build'
    dependsOn 'publish'
}

你在使用java插件吗?@SantoshGokak是的,我不使用。输出:Gradle任务请共享您的构建。Gradle文件项目:日历模块:发布。Gradle订单不保证。您还需要
mustRunAfter
这样还可以单独执行任务吗?我又遇到了一个错误
无法在null对象上调用方法mustRunAfter()
,您的cleanBuildPublish任务必须放在生成脚本中所有3个相关任务之后。请确保在定义所有单个任务之后放置
cleanBuildPublish
。gradle任务似乎是自上而下阅读的。这解决了我在null对象上的
无法调用方法mustRunAfter()的问题
重要的一点是,gradle没有等待任务完成,所以任务将按前面提到的顺序执行?kotlin版本?kotlin版本将非常类似。您只想使用
project.tasks.register
创建任务,仅此而已。Gradle项目特别建议不要这样做:当心嵌套调用:运行
gradlew cleanBuildPublish somethingElse
时,然后可以先运行
somethingElse
,Gradle项目特别建议不要这样做:
task cleanBuildPublish {

    task _clean {
        dependsOn 'clean'
    }

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

    dependsOn '_build'
    dependsOn 'publish'
}