2013-06-26 156 views
1

我讀了許多關於gradle的好東西,所以我印象深刻。很多人都很熱衷於用gradle開發簡單。他們都強調了Gradle的多項目能力。從螞蟻+常春藤遷移到gradle

我已經有了一些子項目的主項目。外部依賴關係在所有項目自己的ivy.xml中定義。並且模塊相互依賴性在eclipse的.classpath文件和ant build.xml中並行定義。這樣我可以爲IDE構建,並可以用ant創建運行時。是否有一種簡單的方法將相同的構建結構從eclipse/ant和ivy移植到gradle(或gradle + ivy)?

構建過程很簡單:

  1. 從的ivy.xml
  2. 解決子項目的依賴關係構建子項目
  3. (重複1和2對所有的子項目)
  4. 解決的依賴關係主要項目(來自ivy和eclipse/ant配置)
  5. 構建主項目
  6. 將所有東西封裝到一個jar文件

不是火箭科學......但它花了很多天在螞蟻實施它。 這真的是一個簡單的遷移到gradle嗎?如果是,那麼起點是什麼?

我看到有一個eclipse插件,但我只看到生成.classpath的可能性,而不是解析/讀取它。我也看到一個Ivy XML插件。我不清楚如何處理依賴項目/模塊?

任何幫助,歡迎。

問候: 本斯

回答

1

你必須手動遷移構建,翻譯build.xml的和ivy.xml的到搖籃的構建語言。 (有一個Ant導入功能,但它在實踐中並不是特別有用。)必要時您可以輕鬆地重用Ant任務。您可以使用Eclipse Gradle插件將Gradle構建導入Eclipse,或使用Gradle Eclipse插件生成Eclipse文件。一個好的開始是研究Gradle User Guide的前幾章,接下來是關於Ant集成和多項目構建的章節。完整的Gradle發行版附帶了許多示例版本。

+1

這聽起來不太容易。重新實現相同的邏輯......這是必要的,以覆蓋我的工作eclipse設置與gradle生成的:反向的方式會更適合我。那麼使用IvyXML插件怎麼樣?爲什麼我應該扔掉我的常春藤設置呢?這是簡單而直接的地方在哪裏? Gradle本身?這是非常方便,它值得的努力? – BTakacs

+0

作爲一個出發點這對我來說似乎更有希望:http://touk.pl/blog/zh/2012/11/26/muliti-module-gradle-project-with-ide-support/ – BTakacs

1

如果你沒有很多自定義ant任務,只需要轉換你常春藤的依賴關係,就會從你的ivy.xml創建gradle依賴關係。粘貼到ivy.xml旁邊的空build.gradle並運行gradle ivyToGradle。然後將輸出複製到您的build.gradle文件中。由於使用了compileOnly配置,因此需要gradle 2.12+。

這不會處理所有可能的ivy.xml設置,您可能需要對ivy.xml的特定使用進行調整。它處理諸如運行時配置,測試配置,僅編譯配置,全局排除,傳遞真​​/假和版本強制等基礎知識。

task ivyToGradle { 
    description "Converts dependencies in ivy.xml to gradle dependencies." 
    doLast { 
     def ivyModule = new XmlParser().parse(new File("$projectDir/ivy.xml")) 
     if (!ivyModule.dependencies.exclude.isEmpty() || !ivyModule.dependencies.override.isEmpty()) { 
      println "configurations.runtime {" 
      ivyModule.dependencies.exclude.each { 
       def excludeStrs = [] 
       if ([email protected] != null) { 
        excludeStrs.add("group: '${[email protected]}'") 
       } 
       if ([email protected] != null) { 
        excludeStrs.add("module: '${[email protected]}'") 
       } 
       if (!excludeStrs.isEmpty()) { 
        def excl = excludeStrs.join(", ") 
        println " exclude ${excl}" 
       } 
      } 
      def overrides = ivyModule.dependencies.override.findResults { 
       if ("exact" != [email protected]) { 
        return null 
       } 
       if ([email protected] || [email protected] || [email protected]) { 
        return null 
       } 
       return "  '${[email protected]}:${[email protected]}:${[email protected]}'" 
      } 
      if (overrides) { 
       println " resolutionStrategy.force(" 
       println overrides.join(",\n") 
       println " )" 
      } 
      println "}" 
      println "" 
     } 
     println("dependencies {") 
     ivyModule.dependencies.dependency.each { 
      def transitive = ("false" != [email protected]) 
      def force = ("true" == [email protected]) 
      def scope = "compileOnly" // Requires gradle 2.12 or later 
      if ([email protected]?.contains("test")) { 
       scope = "testCompile" 
      } else if ([email protected]?.contains("runtime")) { 
       scope = "compile" 
      } 
      def hasBlock = !it.exclude.isEmpty() || !transitive || force 
      if (hasBlock) { 
       println " $scope('${[email protected]}:${[email protected]}:${[email protected]}') {" 
       it.exclude.each { 
        def excludeStrs = [] 
        if ([email protected]org != null) { 
         excludeStrs.add("group: '${[email protected]}'") 
        } 
        if ([email protected] != null) { 
         excludeStrs.add("module: '${[email protected]}'") 
        } 
        if (!excludeStrs.isEmpty()) { 
         def excl = excludeStrs.join(", ") 
         println "  exclude ${excl}" 
        } 
       } 
       if (!transitive) { 
        println "  transitive = false" 
       } 
       if (force) { 
        println "  force = true" 
       } 
       println " }" 
      } else { 
       println " $scope '${[email protected]}:${[email protected]}:${[email protected]}'" 
      } 
     } 
     println("}") 
     println "" 
    } 
}