我有一個 gradle Copy 任務,它將資產從專案目錄復制到構建目錄中:
tasks.register("copyAssets", Copy) {
def fromDir = "${project.projectDir.toString()}/../assets"
def toDir = "${project.buildDir.toString()}/assets"
println "Copying assets"
println " from $fromDir"
println " into $toDir"
from fromDir
into toDir
}
build.dependsOn copyAssets
run.dependsOn copyAssets
這可行,但不知何故,它不僅在build和run上運行,而且在clean上運行。
如果我用 洗掉兩行dependsOn,它不會在build、run或clean上運行。但是只要我輸入build.dependsOnin ,任務就會在build、run和clean上運行。另一方面,如果我洗掉build.dependsOn并放入run.dependsOn,結果是相同的:任務在build、run和clean上運行。
如何dependsOn作業?我怎樣才能讓它在build和run上運行,而不是在clean上運行?
我使用 gradle wrapper,它是一個多模塊專案,即
./gradlew main:clean
./gradlew main:build
./gradlew main:run
該任務僅在主模塊中,不在頂級模塊中build.gradle。
uj5u.com熱心網友回復:
有趣的問題,因為它混合了使用 Gradle 時最常見的兩個錯誤或混淆:
- 任務配置和執行階段的混淆
- 濫用任務配置避免功能。
任務配置與執行階段
很多 SO 問題都在處理這個主題,只需搜索“配置與執行階段”以獲得詳細解釋這一點的答案。一個例子:Gradle 總是從任何任務中執行 println
在您的示例中:您說copyAssets任務在運行clean任務時也會執行,但實際上它沒有執行,它只是配置。
執行gradle build:
> Configure project :sample
Copying assets <==== the println are executed, because they are part of the Configuration phase
from src
into /path/sample/build/
> Task :sample:assemble UP-TO-DATE
> Task :sample:check UP-TO-DATE
> Task :sample:copyAssets <<<===== task copyAssets is executed as expected
> Task :sample:build
執行gradle clean:
> Configure project :sample
Copying assets <==== the println are still executed, because they are part of the Configuration phase
from src
into /path/sample/build/
> Task :sample:clean <<<===== task copyAssets is NOT executed, only clean task is.
您可以檢查呼叫時clean,您的資產不會被復制,您只會在控制臺中看到 println。gradle help請注意,在執行任何其他任務(例如,gradle tasks...)時,您也會看到這些 println
任務配置規避問題
您正在使用registerAPI 宣告您的任務,該 API 啟用了任務配置避免功能。因此,理論上,copyAssets只有在必須執行時才應配置(=> 僅當您呼叫 build或 run示例中的任務時)
那么為什么在您的示例中執行時配置(但未執行)clean?
這是由于您宣告任務依賴項的方式,如任務配置避免陷阱部分中所述/
build.dependsOn copyAssets
=> 這將急切地創建和配置build任務,并且在級聯中還將創建和配置依賴copyAssets任務。
有幾種方法可以解決這個問題,在上面的鏈接中給出。一個例子:
// replace
build.dependsOn copyAssets
// with:
build.dependsOn tasks.named("copyAssets")
uj5u.com熱心網友回復:
啊! 您已放入默認任務關閉 - 這些步驟發生在任務初始化時。
tasks.register("copyAssets", Copy) {
doLast() {
def fromDir = "${project.projectDir.toString()}/../assets"
def toDir = "${project.buildDir.toString()}/assets"
println "Copying assets"
println " from $fromDir"
println " into $toDir"
from fromDir
into toDir
}
}
閱讀 - https://docs.gradle.org/current/userguide/more_about_tasks.html#header
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521310.html
標籤:毕业典礼毕业任务
