自定义 Gradle 执行任务不会并行运行



我的目标是我可以运行./gradlew deployStaging,它执行buildDockerStatic,并行buildDockerBackend,在两个任务完成后,deployStaging将运行。使用下面的代码,任务将串行运行。我已经尝试了一些方法,但是buildDockerStatic,并且buildDockerBackend总是串行运行。

tasks.register("buildDockerStatic", BuildDockerStatic) {
    workingDir rootDir
}
tasks.register("buildDockerBackend", BuildDockerBackend) {
    workingDir rootDir
}
//noinspection GroovyAssignabilityCheck
task deployStaging() {
    dependsOn tasks.buildDockerStatic
    dependsOn tasks.buildDockerBackend
    doLast {
        exec {
            workingDir rootDir
            commandLine 'sh', './scripts/build_deploy_staging.sh'
        }
    }
}
class BuildDockerStatic extends AbstractExecTask<BuildDockerStatic> {
    BuildDockerStatic() {
        //noinspection GroovyAssignabilityCheck
        super(BuildDockerStatic)
        commandLine 'sh', './scripts/build_static.sh'
    }
}
class BuildDockerBackend extends AbstractExecTask<BuildDockerBackend> {
    BuildDockerBackend() {
        //noinspection GroovyAssignabilityCheck
        super(BuildDockerBackend)
        commandLine 'sh', './scripts/build_backend.sh'
    }
}

为了并行运行,需要将构建任务放置在子项目中。

它们应该包含doLast;否则它们将在调用 eg 时被执行。 gradle clean .也许,使用普通task {..}的定义就足够了。


并行:来自 Gradle 的文档:并行执行

通过使用 --parallel 开关,您可以强制 Gradle 并行执行任务,只要这些任务位于不同的项目中。


请参阅下面的修改示例;它将并行运行两个子任务(睡眠和日志(。

它可以与gradle clean deployStaging --parallel一起运行

多项目结构

build-backend
  +--build.gradle
build-static
  +--build.gradle
build.gradle
settings.gradle

build-backend/build.gradle

apply plugin: 'base'
task buildDockerBackend {
  doLast{
    exec {
      println 'BuildDockerBackend: started at ' + new java.util.Date()
      workingDir rootDir
      sleep 4000
      //commandLine 'sh', './scripts/build_backend.sh'
      commandLine 'echo', 'task: build-backend'
      println 'BuildDockerBackend: done at    ' + new java.util.Date()
    }
  }
}

build-static/build.gradle

apply plugin: 'base'
task buildDockerStatic {
  doLast{
    exec {
      println 'BuildDockerStatic: started at ' + new java.util.Date()
      workingDir rootDir
      sleep 8000
      //commandLine 'sh', './scripts/build_static.sh'
      commandLine 'echo', 'task: build-static'
      println 'BuildDockerStatic: done at    ' + new java.util.Date()
    }
  }
}

build.gradle

apply plugin: 'base'
task deployStaging {
  doLast {
    exec {
      workingDir rootDir
      //commandLine 'sh', './scripts/build_deploy_staging.sh'
      commandLine 'echo', 'task: deploy-staging'
    }
  }
}
deployStaging.dependsOn ':build-static:buildDockerStatic'
deployStaging.dependsOn ':build-backend:buildDockerBackend'

settings.gradle

include 'build-static'
include 'build-backend'

最新更新