2013-10-15 78 views
2

我有我的身材,一個Android應用程序和Java庫兩個模塊。 (Side story,Java庫是針對Android應用中的類運行jvm測試,因爲它需要Gradle Java插件,並且與Gradle Android插件不兼容,所以我不得不拆分它們。)導入從一個搖籃模塊的所有依賴於另一個

在java模塊我想自動導入其他模塊的所有依賴關係,以避免讓它們保持同步。

如何配置一個模塊的compileTest依賴項以匹配另一個模塊compile依賴項?

(同時使用插件替代建議表示歡迎。)

+0

不要你從模塊1的依賴關係,如果你只寫'依賴{testCompile項目(「:模塊1」)}'在模塊2的'build.gradle'文件? – Steinar

+0

哦,這確實有用。我最初感到困惑,因爲當我嘗試時,它錯過了很多Android依賴項。但是,由於Android項目應用了Android插件,因此它看起來像這些依賴項沒有列爲依賴關係,因此我必須在第二個模塊中手動添加它。但列出的依賴關係確實被導入。如果您將此作爲答案添加,我會接受它。 – Turnsole

回答

3

你會得到Module 1的compile依賴作爲模塊2 testCompile依賴關係,如果你寫:

dependencies { 
    testCompile project(':module1') 
} 
build.gradle文件模塊2的

。正如您在註釋中所陳述的那樣,如果module1中未應用android插件,則不會從module1中應用android插件。

編輯:增加了如何描述如何在單獨的腳本中定義依賴關係。

正如在評論中提到的,另一種是在一個單獨的腳本,定義了每個第三方依賴添加屬性。我傾向於這樣做的每一個多項目構建的是我參與。其實,因爲我習慣了一個dependencies.gradle文件的存在,我真正做到這一點在單項目構建爲好。

的想法很簡單:

  • 添加一個單獨的腳本屬性定義你的第三方的依賴
  • 應用此腳本的每個模塊中
  • 使用屬性,而不是重複硬編碼無處不

你在一個地方定義所有依賴這種方式,依賴定義的可讀性會增加,你的模塊將永遠彼此不同步(例如,「不同步」)。兩個模塊取決於同一個庫的不同版本)。另外一個好處是你可以將幾個屬於一個屬性的依賴關係組合在一起。

實施例:

說,我們有2個模塊中的問題進行說明。模塊1使用一些第三方庫。模塊2應該測試模塊1,並且需要模塊1中定義的每個庫以及它自己的一些模塊。

dependencies.gradle

ext { 
    JAVAX_MAIL = 'javax.mail:mail:1.4.5' 
    JODA_TIME = 'joda-time:joda-time:2.1' 
    LOG4J = 'log4j:log4j:1.2.16' 
    SPOCK = [ 
      'org.spockframework:spock-core:0.7-groovy-2.0', 
      'org.objenesis:objenesis:1.2', 
      'cglib:cglib-nodep:2.2.2' 
    ] 

    // Note: I don't usually combine dep's like this, it's just for illustration. 
    //  I prefer to spell them out to make it more explicit. 
    MODULE_1_DEPS = [ JAVAX_MAIL, LOG4J ] 
} 

module1/build.gradle

apply from: "$rootDir/dependencies.gradle" 

dependencies { 
    compile MODULE_1_DEPS 
} 

module2/build.gradle

apply from: "$rootDir/dependencies.gradle" 

dependencies { 
    compile JODA_TIME, LOG4J 
    testCompile MODULE_1_DEPS, SPOCK 
} 

注意:如果您將「特性」合併到列表中,則可能會必須將列表弄平。即如:MY_DEP = [ DEP1, DEP2 ].flatten()也許 gradle爲你做,我真的不知道 - 我沒有測試過它。

另外請注意:這裏的例子是關於如何實現你想要的只是說明,他們沒有以任何方式完成。

+0

有趣的是,即使主模塊編譯與傳遞依賴關係很好,它仍然拉入所述的依賴關係,但不是可傳遞的依賴關係。 – Turnsole

+0

令人驚訝 - 它也可能成爲一個問題。在多項目構建中,我傾向於創建一個依賴性定義爲屬性的'dependencies.gradle'文件。這樣,我可以獲得更多可讀的依賴關係定義,並將所有依賴關係定義在一個地方。這些屬性甚至可以包含多個依賴關係(如列表),所以你可以將所有想要的依賴關係合併爲一個,如果這樣做合理的話 - 我想它就是你的情況。如果您願意,我可以編輯我的答案以包含此示例。 – Steinar

+0

我很感激,從維護的角度來看,這聽起來很不錯。 – Turnsole