我目前正在評估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
但這是相對繁瑣,我想看看是什麼反正怎麼回事。
乾杯
馬特
看來答案是與像一個封閉設置'{包括「**/* $ project.targetEnv *。」}' – Matt 2012-03-03 21:53:31