[英]How to make Gradle fail the build if a file dependency is not found?
我有一個 Gradle 構建,它有一些表單的依賴項
compile files('path/to/local/lib.jar')
(構建正在遷移 - 最終這些將被替換)
構建失敗,因為這些路徑之一指定不正確。 但它由於編譯錯誤而失敗 - 看起來 Gradle 默默地忽略了丟失的依賴項。
如果任何依賴項(特別是本地文件依賴項)無法解析(例如,文件丟失),是否有一個簡單的選項或開關會強制 Gradle 構建失敗?
編輯:進一步澄清:
如果在配置的存儲庫中找不到依賴項,Gradle 將在嘗試解析它們時構建失敗,正如預期的那樣。
但是 - 如果依賴項被定義為“編譯文件....”,並且指定的文件在構建時不存在,Gradle 將忽略該錯誤,並嘗試編譯。 這似乎是非常錯誤的和不一致的默認行為。
我的問題是 - 是否有 Gradle 選項或開關或環境變量或系統屬性可以設置以強制 Gradle 驗證文件依賴項是否存在? (例如,以理智和理性的方式行事?)
以下是使用 Gradle 7.3 檢查傳遞依賴項的方法(例如:如果項目直接或傳遞依賴於 log4j,則失敗)。
科特林 DSL
configurations {
all {
relsolutionStrategy {
eachDependency {
if (requested.name == "log4j") {
throw RuntimeException("Project depends on log4j")
}
}
}
}
}
常規DSL
configurations.all {
resolutionStrategy.eachDependency { DependencyResolveDetails details ->
if (details.requested.name == 'log4j') {
throw new RuntimeException("Project depends on log4j")
}
}
}
要使構建失敗,您可以:
ant.fail('message why it failed')
然后你可以制作一個條件,然后用好的消息使構建失敗;)
我建議創建一個任務,首先將文件帶入項目,並有條件檢查文件是否可用等,如果不可用,則拋出 Gradle 異常並通過消息使構建失敗,並在執行中首先執行任務階段。
我現在沒有機會測試它,但它可能是這樣的,如果有任何語法錯誤,請糾正我 - 但你應該明白這個想法。
def yourDep = $/\path\to\your\depdendency/$
task bringDeps << {
if (yourDep.exists()){
copy {
from yourDep
into $projectDir/depsOrSmthg
}
} else{
ant.fail('message why it failed')
}
}
您可以執行如下所示的操作。 它不是內置的 Gradle 函數,但不需要代碼來專門檢查每個依賴項(它在compile
配置中檢查所有依賴項):
apply plugin: 'java'
dependencies {
compile files('lib/abc.jar')
compile files('lib/def.jar')
}
task checkDependencies() {
doLast {
configurations.compile.each { file ->
assert file.exists()
}
}
}
compileJava.dependsOn checkDependencies
task ensureDependenciesExist() {
doLast {
configurations.implementation.canBeResolved(true)
DependencySet deps = configurations.implementation.getDependencies()
Set<File> impFiles = configurations.implementation.resolve()
deps.each { d ->
boolean depWasResolved = impFiles.any { impFile -> impFile.name.find(".*${d.name}.*${d.version}") }
if (!depWasResolved) {
println "${d} was not resolved"
assert depWasResolved
}
}
}
}
compileJava.dependsOn ensureDependenciesExist
這是一個有點舊的線程,但鑒於目前提出的解決方案都沒有實際工作,而且該解決方案似乎微不足道(整理其中兩個),我將其留在這里以供將來參考。
這里的重點是我們只是想確保文件確實存在,所以我們可以使用File
類的exists()
方法:
task ensureDepsExist() {
doLast {
configurations.implementation.canBeResolved(true)
Set<File> impFiles = configurations.implementation.resolve()
impFiles.forEach { f ->
if (!f.exists()) {
ant.fail "${f} could not be found"
}
}
}
}
compileJava.dependsOn ensureDepsExist
canBeResolved()
調用是必需的,否則 Gradle 會抱怨configurations
依賴項無法解析。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.