2012-03-03 79 views
0

我目前正在評估gradle,作爲基於本地約定的ant + ivy構建的Maven的替代方案。螞蟻+常春藤構建的目的是提供一個廣泛的J2SE應用程序&的標準環境,它支持下面的常規佈局,應用程序配置基於在配置階段完成後確定的模式複製文件

conf/ 
    fooPROD.properties 
    fooUAT.properties 
    bar.properties 
    UK/ 
     bazPROD.properties 
     bazUAT.properties 

如果我選擇做UAT構建然後我得到

conf/ 
    foo.properties 
    bar.properties 
    UK/ 
     baz.properties 

即它複製後綴爲目標環境(本例爲UAT)的文件以及任何沒有此類模式的文件。還有很多其他的事情會發生,使它更復雜,但這是我目前問題的核心。

我一直在玩各種gradle功能,同時抄錄這個,而不是讓它工作。我目前的做法是,以允許提供targetenv上飛像這樣

tasks.addRule("Pattern: make<ID>") { String taskName -> 
    task(taskName).dependsOn tasks['make'] 
} 

與各種複印/過濾/的conf文件將來自SRC到構建區域的化妝任務交易。要做到這一點,就必須制定出targetenv是什麼,我的DAG已創建

gradle.taskGraph.whenReady {taskGraph -> 
    def makeTasks = taskGraph.getAllTasks().findAll{ 
     it.name.startsWith('make') && it.name != 'make' 
    } 
    if (makeTasks.size() == 1) { 
     project.targetEnv = makeTasks[0].name - 'make' 
    } else { 
     // TODO work out how to support building n configs at once 
    } 
} 

後我目前做的(感覺必須有這樣做,但我離題更快/更習慣的方法)

我可以運行它像gradle makeUAT

我的問題是,在這樣設定targetEnv意味着targetEnv沒有設置在配置時。因此,如果我有一個副本任務一樣

task prepareEnvSpecificDist(type: Copy) { 
    from 'src/main/conf' 
    into "$buildDir/conf" 
    include "**/*$project.targetEnv.*" 
    rename "(.*)$project.targetEnv.(.*)", '$1.$2' 
} 

它不會做我想做的,因爲$project.targetEnv還沒有確定呢。天真地,我改變了這個

task prepareEnvSpecificDist(type: Copy) << { 
    from 'src/main/conf' 
    into "$buildDir/conf" 
    include "**/*$project.targetEnv.*" 
    rename "(.*)$project.targetEnv.(.*)", '$1.$2' 
} 

一旦我明白髮生了什麼事情。這種失敗,則像

Skipping task ':prepareEnvSpecificDist' as it has no source files. 

,因爲我還沒有配置的副本任務,告訴它的輸入和輸出。

Q是如何處理基於配置完成後變得具體的屬性的任務配置問題?

注:我知道我可以在傳遞一個系統屬性,並完成類似gradle -Dtarget.env=UAT make但這是相對繁瑣,我想看看是什麼反正怎麼回事。

乾杯

馬特

+0

看來答案是與像一個封閉設置'{包括「**/* $ project.targetEnv *。」}' – Matt 2012-03-03 21:53:31

回答

2

大廈爲特定目標環境是一個橫切關注點並沒有真正適合任務的性質。使用系統屬性(-D)或項目屬性(-P)是處理此問題的一種自然方式。

如果您絕對想要保存幾個字符,則可以查詢和操作gradle.startParameter.taskNames以實現看起來像任務名稱的環境切換。但是,這是一個非標準的解決方案。

如何處理基於配置完成後變成具體的屬性的任務配置問題?

這是配置值在讀取後寫入的一般問題的特例。典型的解決方案是:

  1. 避免它,如果你可以。
  2. 某些任務/模型屬性接受一個閉包,然後這個閉包將被懶惰地評估。這需要在相應的任務/插件文檔中查找。
  3. 在像gradle.projectsEvaluatedgradle.taskGraph.whenReady(取決於確切需要)的全局鉤子中執行配置。
  4. 在任務操作中(執行時)執行配置。正如你已經經歷的那樣,這在所有情況下都不起作用,並且通常不鼓勵(但有時可以忍受)。
  5. 插件使用convention mapping將模型值延遲綁定到任務屬性。這是一種不應該用於構建腳本的高級技術,但是對於編寫擴展構建語言的插件來說是必需的。

請注意,Gradle允許您引入自己的抽象。例如,您可以添加,讓一個方法,你寫:

environment("uat") { 
    // special configuration for UAT environment 
} 
+0

上附註,如何做到這一點? – Matt 2012-03-05 17:42:32

相關問題