Configuration Gradle自定义任务是否仅应用于某些子项目?

Configuration Gradle自定义任务是否仅应用于某些子项目?,configuration,build,gradle,subproject,Configuration,Build,Gradle,Subproject,我已经创建了一个自定义herpderpGradle任务: task herpderp(type: HerpDerpTask) class HerpDerpTask extends DefaultTask { @TaskAction def herpderp() { println "Herp derp!" } } 这样,我可以将此任务添加到其他Gradle构建中,并在其他项目的构建调用中使用它: gradle clean build herpderp

我已经创建了一个自定义
herpderp
Gradle任务:

task herpderp(type: HerpDerpTask)

class HerpDerpTask extends DefaultTask {
    @TaskAction
    def herpderp() {
        println "Herp derp!"
    }
}
这样,我可以将此任务添加到其他Gradle构建中,并在其他项目的构建调用中使用它:

gradle clean build herpderp
现在,我有以下多项目设置:

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
其中
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'
        )
    }
}
include ':myapp-shared'
include ':myapp-client'
include ':myapp-server'
其中
myapp/settings.gradle
是:

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

    repositories {
        mavenLocal()
        mavenCentral()
    }

    dependencies {
        compile (
            'org.codehaus.groovy:groovy-all:2.3.7'
        )
    }
}
include ':myapp-shared'
include ':myapp-client'
include ':myapp-server'
我希望能够导航到父
myapp
目录,并运行
gradler clean build herpderp
,并使
herpderp
任务仅在
myapp客户端
myapp共享
项目(而不是服务器项目)上运行

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

  • 运行
    清洁构建
    ;然后
  • 将(
    cd
    )放入
    myapp客户端
    并运行
    herpderp
    ;然后
  • 进入
    myapp shared
    并运行
    herpderp

  • 要从父构建命令调用
    herpderp
    ,但仅在客户端和共享子项目中执行,我需要向我的任何文件中添加什么内容?

    以下代码可以完成此任务(应放在
    myapp/build.gradle
    中):

    如中所示,您可以通过以下方式筛选子项目并对其进行配置:

    configure(subprojects.findAll { it.name.endsWith("server") }) {
        apply plugin: 'com.google.cloud.tools.jib'
        jib {
           from {
              image = 'openjdk:alpine'
           }
        }
        ...
    }
    

    您可以在给定模块中使用以下命令运行
    herpderp
    任务:
    gradle:myapp shared:herpderp
    谢谢@Opal-那么您是说
    gradle clean build:myapp client:herpderp:myapp shared:herpderp
    ?如果是这样的话,我是否可以做些什么来包装它(看起来有点讨厌),以便简化构建调用?也许有一种方法可以包装
    herpderp
    ,使
    gradle clean build smartHerpDerp
    gradle clean build:myapp client:herpderp:myapp shared:herpderp
    相同。有什么想法吗?再次感谢!是的,这就是我们所想的。您还可以只向指定的子项目添加
    herpderp
    。我马上就去做。非常感谢@Opal(如果我有代表的话,我会投票给你)!但是,我的构建调用在父
    myapp
    目录中是什么?只是
    gradle clean build
    ?再次感谢!在
    myapp
    目录中,只需运行
    gradle clean build herpderp
    ,然后
    clean
    build
    将在所有项目中调用,并且
    herpderp
    仅在指定的(
    shared
    client
    )中调用。您不必回答这个@Opal(我已经接受了您的答案,再次感谢!)但我只是好奇这里发生了什么。如果我运行
    gradle clean build herpderp
    ,gradle怎么知道执行你的
    findAll
    闭包,并且只为所选子项目配置
    HerpDerpTask
    ?需要更详细的解释:让我们继续聊天:谢谢,但看起来我没有足够的代表加入聊天室(因此要求最少20人)。