Gradle自定义任务仅适用于某些子项目?

sme*_*eeb 3 configuration build subproject gradle

我创建了一个自定义herpderpGradle任务:

task herpderp(type: HerpDerpTask)

class HerpDerpTask extends DefaultTask {
    @TaskAction
    def herpderp() {
        println "Herp derp!"
    }
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以将此任务添加到其他Gradle构建中,在其他项目的构建调用中使用它:

gradle clean build herpderp
Run Code Online (Sandbox Code Playgroud)

现在,我有以下多项目设置:

myapp/
    myapp-client/
        build.gradle
        src/** (omitted for brevity)
    myapp-shared/
        build.gradle
        src/** (omitted for brevity)
    myapp-server
        build.gradle
        src/** (omitted for brevity)
    build.gradle
    settings.gradle
Run Code Online (Sandbox Code Playgroud)

在哪里myapp/build.gradle:

subprojects {
    apply plugin: 'groovy'
    sourceCompatibility = '1.7'
    targetCompatibility = '1.7'

    repositories {
        mavenLocal()
        mavenCentral()
    }

    dependencies {
        compile (
            'org.codehaus.groovy:groovy-all:2.3.7'
        )
    }
}
Run Code Online (Sandbox Code Playgroud)

在哪里myapp/settings.gradle:

include ':myapp-shared'
include ':myapp-client'
include ':myapp-server'
Run Code Online (Sandbox Code Playgroud)

我希望能够导航到父myapp目录,并运行gradler clean build herpderp并让herpderp任务仅在myapp-clientmyapp-shared项目(而不是服务器项目)上运行.

所以听起来我需要另一个自定义任务或某种类型的闭包/方法myapp/build.gradle:

  1. 运行clean build; 然后
  2. Drops(cd)进入myapp-client并运行herpderp; 然后
  3. 落入myapp-shared并运行herpderp.

为了从父构建命令调用,我需要添加到我的任何文件中herpderp,但只在客户端和共享子项目中执行?

Opa*_*pal 5

下面这段代码可以解决问题(应放在myapp/build.gradle)中:

allprojects.findAll { it.name in ['myapp-client', 'myapp-shared'] }. each { p ->
   configure(p) {
      task herpderp(type: HerpDerpTask)
   }
}

class HerpDerpTask extends DefaultTask {
    @TaskAction
    def herpderp() {
        println "Herp derp from ${project.name}!"
    }
}
Run Code Online (Sandbox Code Playgroud)