2014-03-03 48 views
4

我已經設置了多模塊Gradle構建,其中包含多個模塊。我想要做的事非常簡單 - 當我創建一個發行版時,我總是希望使用一個名爲「dist/lib」的目錄,除了一個項目,它應該是「dist」。無法覆蓋多項目構建中的Gradle中的屬性

顯而易見的解決方案 - 創建一個名爲「distLibDir」的變量,併爲特定項目覆蓋它,似乎沒有工作。

下面是子模塊的代碼:

project.version = '1.1' 

project.ext.distLibDir = 'dist' 

dependencies { 
.... 
} 

而這裏的頂級項目代碼:

subprojects { 
    apply plugin: 'java' 
    apply plugin: 'eclipse' 

    if (! project.hasProperty('distLibDir')) { 
     project.ext.distLibDir = 'dist/lib' 
    } 

    task copyLib(type: Copy) { 
     into project.distLibDir 
     from configurations.runtime 
    } 

    task dist(type: Copy, dependsOn: [clean, jar, copyLib]) { 
     from 'build/libs' 
     into project.distLibDir 
    } 
} 

無論我怎麼努力,該目錄永遠是對是「dist/lib」,我不能將它覆蓋爲只有一個模塊。有沒有人知道這裏發生了什麼問題?

回答

4

默認情況下,構建父項目的腳本會在構建子項目的腳本之前進行評估。因此,當您檢查其存在時,該屬性不存在。

有幾種解決方案。一種是根據當前項目的名稱或路徑(例如if (project.path == ":foo") {...} else {...})在父腳本的suprojects塊中設置該屬性的值。另一種方法是將subprojects塊的主體(或至少是使用該屬性的部分)移動到腳本插件中,並從每個構建腳本中應用該插件(例如apply from: "$rootDir/gradle/foo.gradle")。這使您有機會在應用腳本插件之前設置屬性的值。另一個解決方案(我個人試圖避免)是保持原樣,並在從父構建腳本訪問屬性之前調用​​。

+0

我最終以if(project.path ==「:foo」){...} else {...})解決方案。謝謝彼得! – matvey

相關問題