Gradle 檔案的“避免陷阱”一章有一個示例“配置和執行階段”。關聯
請務必記住,Gradle 具有不同的配置和執行階段(請參閱構建生命周期)。
def classesDir = file('build/classes')
classesDir.mkdirs()
tasks.register('clean', Delete) {
delete 'build'
}
tasks.register('compile') {
dependsOn 'clean'
doLast {
if (!classesDir.isDirectory()) {
println 'The class directory does not exist. I can not operate'
// do something
}
// do something
}
}
有2個任務,compile和clean。構建目錄是作為專案的一部分創建的。該clean任務包含洗掉構建目錄的命令。該compile任務包含檢查構建目錄的子目錄是否存在。
起初,這似乎是一個易于理解的例子:一個目錄不可用,因為它被更早地洗掉了。但后來我注意到一些我無法理解的東西。
由于目錄的創建發生在配置階段,清理任務在執行階段洗掉目錄。
我理解第一部分,因為構建目錄是在專案的配置階段創建的。我不明白的是第二部分。檔案說這發生在執行階段。但是目錄的洗掉并沒有包含在doFirstordoLast塊中,因此這部分任務應該在配置階段進行。
試圖理解,第一輪
為了獲得更好的概述,我添加了更多內容println并洗掉了僅注釋行。
def classesDir = file('build/classes')
classesDir.mkdirs()
println "configuration phase of project";
tasks.register('clean', Delete) {
println "step 1 in configuration phase of " getName();
delete 'build'
println "step 3 in configuration phase of " getName();
}
tasks.register('compile') {
println "configuration phase of " getName();
dependsOn 'clean'
doLast {
if (!classesDir.isDirectory()) {
println 'The class directory does not exist. I can not operate'
}
}
}
啟動 gradle via./gradlew compile --info提供了以下輸出。
configuration phase of project
All projects evaluated.
configuration phase of compile
Selected primary task 'compile' from project :
step 1 in configuration phase of clean
step 3 in configuration phase of clean
Tasks to be executed: [task ':clean', task ':compile']
Tasks that were excluded: []
:clean (Thread[Execution worker for ':',5,main]) started.
> Task :clean
Caching disabled for task ':clean' because:
Build cache is disabled
Task ':clean' is not up-to-date because:
Task has not declared any outputs despite executing actions.
:clean (Thread[Execution worker for ':',5,main]) completed. Took 0.002 secs.
:compile (Thread[Execution worker for ':',5,main]) started.
> Task :compile
Caching disabled for task ':compile' because:
Build cache is disabled
Task ':compile' is not up-to-date because:
Task has not declared any outputs despite executing actions.
The class directory does not exist. I can not operate
:compile (Thread[Execution worker for ':',5,main]) completed. Took 0.0 secs.
關于我的問題,我沒有從這個輸出中獲得更多資訊。為什么目錄在執行階段被洗掉,盡管沒有被包裝在一個doFirst或doLast塊中?這與洗掉有關嗎?
試圖理解,第 2 輪
我想相信這是檔案中的一個錯誤,但是在稍微修改了代碼之后,這不合適。
def classesDir = file('build/classes');
classesDir.mkdirs();
tasks.register('clean', Delete) {
doFirst {
delete 'build';
println "[debug-print] (" getName() ") build directory exists in doFirst: " file("build").exists();
}
doLast {
println "[debug-print] (" getName() ") build directory exists in doLast: " file("build").exists();
}
}
tasks.register('compile') {
dependsOn 'clean'
doFirst {
println "[debug-print] (" getName() ") build directory exists in doFirst: " file("build").exists();
}
doLast {
println "[debug-print] (" getName() ") build directory exists in doLast: " file("build").exists();
}
}
的輸出./gradlew compile是:
> Task :clean
[debug-print] (clean) build directory exists in doFirst: true
[debug-print] (clean) build directory exists in doLast: false
> Task :compile
[debug-print] (compile) build directory exists in doFirst: false
[debug-print] (compile) build directory exists in doLast: false
這看起來delete實際上并沒有洗掉目錄,或者至少不是立即洗掉。這與Delete的 javadoc 匹配:
添加一些要被此任務洗掉的檔案。
但是話又說回來,我不明白實際的目錄洗掉何時發生。在執行階段,但不是 indoFirst和 not in doLast? 這與我對執行階段的理解不符。
uj5u.com熱心網友回復:
tasks.register('clean', Delete) {
println "step 1 in configuration phase of " getName();
delete 'build'
println "step 3 in configuration phase of " getName();
}
這個Delete通過 配置任務Delete.delete(),它在配置程序中將要洗掉的內容排隊,但任務的實際操作直到執行階段才會發生。
tasks.register('clean', Delete) {
doFirst {
delete 'build';
println "[debug-print] (" getName() ") build directory exists in doFirst: " file("build").exists();
}
doLast {
println "[debug-print] (" getName() ") build directory exists in doLast: " file("build").exists();
}
}
在任務操作執行之前,這似乎是Delete.delete()在執行階段(即時修改任務配置)排隊要洗掉的目錄。看起來是這樣的,因為doFirst { }在執行期間運行,并且目錄在doLast { }.
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/462513.html
