2014-07-17 73 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? –

相關問題