2014-12-28 59 views
1

我创建了一个自定义herpderp摇篮任务:Gradle自定义任务仅适用于某些子项目?

task herpderp(type: HerpDerpTask) 

class HerpDerpTask extends DefaultTask { 
    @TaskAction 
    def herpderp() { 
     println "Herp derp!" 
    } 
} 

有了这个,我可以将此任务添加到其他的摇篮构建一个使用它的内部建立其他项目调用:

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' 
     ) 
    } 
} 

在哪里myapp/settings.gradle是:

include ':myapp-shared' 
include ':myapp-client' 
include ':myapp-server' 

我希望能够浏览到父myapp目录,并运行gradler clean build herpderp并有herpderp任务仅在myapp-clientmyapp-shared项目运行(不服务器项目)。

所以,它听起来就像我需要内部myapp/build.gradle或者其他自定义任务或某些类型的封闭装置/方法:

  1. 奔跑clean build;然后
  2. 滴(cd)为myapp-client并运行herpderp;然后
  3. 放入myapp-shared并运行herpderp

我需要什么添加到我的文件的任何为了得到herpderp从父生成命令调用,但仅在客户端和共享子项目执行?

+0

可以与给定模块中运行'herpderp'任务:'的gradle:MyApp的共享:herpderp' – Opal

+0

谢谢@Opal - 你在说什么像'gradle clean build:myapp-client:herpderp:myapp-shared:herpderp'?如果是这样,有什么我可以做*包装*(它有点讨厌看),以便我可以有一个简化的构建调用?也许一种方法来包装'herpderp',以便'gradle clean build smartHerpDerp'与'gradle clean build:myapp-client:herpderp:myapp-shared:herpderp'相同。有任何想法吗?再次感谢! – smeeb

+0

是的,这是在想什么。你还可以做的是只将herpderp添加到指定的子项目中。将尝试在一瞬间做到这一点。 – Opal

回答

4

下面一段代码可以执行特技(应放置在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}!" 
    } 
} 
+0

非常感谢你@Opal(如果我有代表,我会赞成你)!但是,我的构建调用将在父'myapp'目录内?只是**'gradle clean build' **?再次感谢! – smeeb

+0

在'myapp'目录中运行'gradle clean build herpderp',然后'clean'和'build'将在所有项目中调用,'herpderp'只在指定的('shared'和'client')调用。 – Opal

+0

你不必回答@Opal(我已经接受了你的回答 - 再次感谢!),但我只是好奇这里发生了什么。如果我运行'gradle clean build herpderp',Gradle如何知道如何为选定的子项目执行'findAll'闭包和*只*配置'HerpDerpTask'? – smeeb

相关问题