2014-07-17 47 views
1

我将以下build.gradlesettings.gradle的组合组合在一起,用于创建多个单模块项目中的临时多模块项目(例如,应用程序及其所有依赖项或共享库以及所有使用该模块的项目图书馆)。Gradle插件可以修改多模块项目中的子项目列表吗?

settings.gradle

// find all subprojects and include them 
rootDir.eachFileRecurse { 
    if (it.name == "build.gradle") { 
    def projDir = it.parentFile 
    if (projDir != rootDir) { 
     include projDir.name 
     project(":${projDir.name}").projectDir = projDir 
    } 
    } 
} 

build.gradle:

// Make sure we've parsed subproject dependencies 
evaluationDependsOnChildren() 

// Map of all projects by artifact group and name 
def declarationToProject = subprojects.collectEntries { p -> [toDeclaration(p), p] } 

// Replace artifact dependencies with subproject dependencies, if possible 
subprojects.each { p -> 
    def changes = [] // defer so we don't get ConcurrentModificationExceptions 
    p.configurations.each { c -> 
    c.dependencies.each { d -> 
     def sub = declarationToProject[[group:d.group, name:d.name]] 
     if (sub != null) { 
     changes.add({ 
      c.dependencies.remove(d) 
      p.dependencies.add(c.name, sub) 
     }) 
     } 
    } 
    } 
    for (change in changes) { 
    change() 
    } 
} 

这工作,但很难分享 - 如果别人想要做类似他们要复制我*.gradle文件或削减的东西,糊。

我想要做的就是把这个功能封装在一个插件中。 build.gradle部分看起来很容易在插件apply()方法中完成,但似乎在插件获得机会之前,子项目列表已经设置完毕。有没有什么办法可以在构建过程的早期进入,例如通过申请除Project以外的东西?或者我应该辞职给我的插件一个覆盖settings.gradle的任务?


解决方案:Peter Niederweiser's answer,我提出上面的代码为两个插件,一个从settings.gradle称为和其他从build.gradle被调用。在settings.gradle:

buildscript { 
    repositories { /* etc... */ } 
    dependencies { classpath 'my-group:my-plugin-project:1.0-SNAPSHOT' } 
} 

apply plugin: 'find-subprojects' 

而且在build.gradle:

buildscript { 
    repositories { /* etc... */ } 
    dependencies { classpath 'my-group:my-plugin-project:1.0-SNAPSHOT' } 
} 

evaluationDependsOnChildren() 
apply plugin: 'local-dependencies' 

注意,从settings.gradle调用插件不会在摇篮1.11或1.12的工作,但确实在摇篮2.0工作。

+0

我已经接近100%确定您只能在您的设置文件中执行此操作,至少使用当前的Gradle 1.x/2.x版本。当然,你总是可以分叉Gradle并提交一个pull请求。 :) – superEb

回答

1

你需要在settings.gradle上应用一个插件,我相信它在最近的版本中被支持。

+0

听起来很有希望。我已经实现了一个'Plugin ',但是不知道如何加载它('没有找到'插件'id'my-plugin')。我认为这可能是由于[GRADLE-2914](http://issues.gradle.org/browse/GRADLE-2914),但使用完全限定的类名称而不是ID,我仍然得到'带ID的插件'mypackage。 MyPluginClass'未找到'。我应该使用不同的机制来注册插件吗? –

+0

PS我在同一个JAR中有一个'Plugin ','build.gradle'发现一个很好。 –

+0

你在'settings.gradle'中有'buildscript'块吗?你有没有尝试过最新的Gradle? –

相关问题