簡體   English   中英

如果找不到文件依賴項,如何使 Gradle 構建失敗?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM