2016-08-19 84 views
0

我有一個多項目Gradle構建,其中子項目被分配獨立於根項目的版本號。我想將這個版本號注入每個子項目的幾個資源文件中。通常情況下,我會通過在根構建中爲每個子項目配置processResources任務來完成此任務。然而,問題在於,在加載子項目的構建文件之前,Gradle似乎正在執行processResources任務,並且正在注入「未指定」作爲版本。在配置子項目後執行Gradle任務

目前,我的項目是這樣的:

/settings.gradle

include 'childA' // ... and many others 

/build.gradle

subprojects { 
    apply plugin: 'java' 
    apply plugin: 'com.example.exampleplugin' 
} 

subprojects { 
    // This has to be configured before processResources 
    customPlugin { 
     baseDir = "../common" 
    } 

    processResources { 
     // PROBLEM: version is "unspecified" here 
     inputs.property "version", project.version 

     // Inject the version: 
     from(sourceSets.main.resources.srcDirs) { 
      include 'res1.txt', 'res2.txt', 'res3.txt' 
      expand 'version':project.version 
     } 
     // ... 
    } 
} 

/childA/build.gradle

version = "0.5.424" 

我看着在根的build.gradle的開頭添加evaluationDependsOnChildren(),但會導致一個錯誤,因爲customPlugin { ... }childA/build.gradle運行。我嘗試過使用dependsOn,mustRunAfter和其他技術,但沒有一個看起來有理想的效果。 (也許我不完全瞭解生命週期,但是似乎在子項目之前配置並執行了根項目,不應配置root,然後配置子項目,然後執行?)

我該如何獲得將每個子項目的版本注入適當的資源文件中,而不需要大量的複製/粘貼或樣板文件?

+0

你有沒有想過這個?你可以做的一件事就是調用project.subprojects {sub - > sub.evaluate() //在子項目被評估後把代碼放在這裏}但是我試圖在不改變評估邏輯的情況下做到這一點,所以如果你想出另一個解決方案我很樂意聽到它 – BoredAndroidDeveloper

回答

1

試着做這樣的:

subprojects { project -> 
    // your code 
} 

否則project將把這裏沒有指定版本的根項目。

+1

嘗試過,但是Gradle說'項目'沒有屬性,儘管我在子項目中設置它們。 – Wrench

1

我明白了我的想法。我正在使用init.gradle文件將某些內容應用到rootProject,但我需要來自子項目的數據。

第一種選擇是評價各子項目之前,我修改了它:

rootProject { 
    project.subprojects { sub -> 
     sub.evaluate() 
     //Put your code here 

但我不知道效果迫使子項目評估會有什麼副作用,所以我做了以下內容:

allprojects { 
    afterEvaluate { project -> 
     //Put your code here 
相關問題