2013-07-17 50 views
12

我正在嘗試構建多項目的dist。根項目看起來像這樣:Gradle多項目分佈

apply plugin: 'distribution' 
version 1.0 
distributions { 
    main { 
     baseName = 'someName' 
     contents { 
      from 'nodes' 
     into 'nodes' 
     } 
    } 
} 

它只是將一些文件的文件夾複製到dist。

我現在想每個子項目注入其東西到DIST。我要添加的每個子項目罐子,任何依賴條件,可能還有一些其他的文件等..

我不知道如何從子項目到根注入。我是否應該這樣做?我的意思是這樣的:

subprojects { 
    apply java... 
    ... 

    // pseudocode 
    jack into the root project dist plugin 
    put my produced jars and dependencies in a folder with my name 
    ... 
} 

有沒有人有任何例子,或者只是指出我在正確的方向?

謝謝!

回答

11

我在找同樣的東西。隨着在API文檔一些偷看和搖籃」自己的編譯文件,我來到了以下內容:

apply plugin: 'distribution' 

distributions { 
    main { 
     contents { 
      into('bin') { 
       from { project(':subproject1').startScripts.outputs.files } 
       from { project(':subproject2').startScripts.outputs.files } 
       fileMode = 0755 
      } 
      into('lib') { 
       def libs = [] 
       libs << project(':subproject1').configurations.runtime - project(':runner').configurations.runtime 
       libs << project(':subproject2').configurations.runtime 
       from libs 
       from project(':subproject1').jar 
       from project(':subproject2').jar 
      } 
     } 
    } 
} 

contents {}封閉是CopySpec,明知使得使用分配插件方式簡單:)

檢查出Gradle'自己的子項目/分發/ distributions.gradle文件的一些很好的例子使用CopySpec。

This Works。

  • 減法是刪除重複的罐子。
  • 「.jar」行將添加該項目的jar作爲配置.runtime似乎只包含依賴性。

不幸的是,目前我還不知道如何以一種乾淨的方式將其擴展到兩個以上的項目。 ATLEAST我們更近了一步:)

5

我發現,一直爲我工作很好的解決方案。關鍵是你添加一個單獨的子項目來創建dist。這個子項目是兄弟到其他子項目。也就是說,不要試圖在您的頂級build.gradle文件中編寫腳本。

讓我們把新的子項目dist。要做的第一件事是將其添加到您的頂級settings.gradle文件在多項目根:

include "subproject1", "subproject2", "subproject3", ....... , "dist" 

dist項目必須至少包括:

  • build.gradle - 下面是詳細
  • src/main/dist/at_least_one_dummy_file.txt - 分佈插件總是需要src/main/$distribution.name目錄。具有 main的非空字符會欺騙插件以遵循所有兄弟項目的所有main源集的所有傳遞依賴關係。

接下來,build.gradle文件的dist項目:

/* Hook in all sibling project jars and their transitive dependencies */ 
apply plugin: 'java' 
dependencies { 
    compile project(':subproject1') 
    compile project(':subproject2') 
    compile project(':subproject3') 
    . . . 
} 

/* Distribution */ 
apply plugin: 'java-library-distribution' 
distributions { 
    main { 
     baseName = "your-top-level-project-name" 
     contents { 
      exclude "dist-${version}.jar" 
      . . . 
     } 
    } 
} 

然後運行gradle distZipdist/build/distributions中的ZIP文件將有一個lib子目錄,您需要每個JAR子目錄:兄弟項目JAR和它們的傳遞依賴項。

由於我們使用的詭計,分配插件將會產生一個空的JAR,稱爲dist-${version}.jar。出於美觀的原因,我將上面的exclude調用刪除它,但它是無害的。如果在src/main/dist之下確實沒有您想要包含的內容,您也可以使用第二個exclude電話來刪除at_least_one_dummy_file.txt。如果你不想添加任何文物和/或刪除這裏提到的那些,那麼你根本不需要contents部分。

我也根據這是一個「dev」還是「prod」分佈,la Maven概要文件,找到了有選擇地包含不同工件的方法。如果你想讓我補充一點,請發表評論,我會。

3

我實際上是通過將來自pvdissel和sparc_spread的方法結合起來的。

在我的根項目中,我創建了一個目錄src/main/dist,我在其中放入了一個名爲.gitkeep的文件。

build.gradle文件我的根項目如下所示:

apply plugin: 'java-library-distribution' 

allprojects { 
    .... 
} 

dependencies { 
    // let root project depend on all subprojects that have the 
    // application plugin enabled 
    project.subprojects.each { p -> 
     p.plugins.withType(ApplicationPlugin) { 
      compile p 
     } 
    } 
} 

distributions { 
    main { 
     contents { 
      // exclude unnecessary files from archive 
      exclude ".gitkeep" 
      exclude "cs3d-toolbox-${version}.jar" 

      // add start scripts of all plugins that have the 
      // application plugin enabled to the archive 
      project.subprojects.each { p -> 
       p.plugins.withType(ApplicationPlugin) { 
        into('bin') { 
         from { p.startScripts.outputs.files } 
         fileMode = 0755 
        } 
       } 
      } 
     } 
    } 
} 

工作得很好我。使用Gradle 2.0進行測試。

1

這是我使用在多個庫項目以創建「釋放」歸檔設置:

apply plugin: 'distribution' 

distributions { 
    main { 
    baseName = libVersion 
    contents { 
     project.subprojects.each { sub -> 
     into('lib') { 
      from sub.jar 
     } 
     into('src') { 
      from sub.sourcesJar 
     } 
     into('doc') { 
      from sub.javadocJar 
     } 
     } 
    } 
    } 
} 

使用distZip任務與他們的文件分爲三個文件夾中的所有庫創建歸檔( lib包含實際的罐子,src包含罐子與來源和doc包含 - 你猜對了 - Javadoc罐子)。

+0

我不能使用Gradle 3.3進行這項工作。 –