簡體   English   中英

為什么 Gradle 或 Maven 沒有依賴版本鎖定文件?

[英]Why doesn't Gradle or Maven have a dependency version lock file?

最近在閱讀 NPM、Yarn、Paket、Cargo 等包管理器時,我被引入了依賴版本鎖定文件的概念。我的理解是,它是一個列出所有直接和傳遞依賴項及其確切的文件版本號,以便保證后續構建使用等效的依賴項集。 這似乎是一個理想的特性,因為許多包管理器已經或正在采用這個概念。

我的問題是:

  1. 為什么 Maven 或 Gradle 不使用鎖定文件? 或者如果他們這樣做了,為什么我沒有看到它?

  2. 在包管理器的依賴項解析策略中允許版本范圍與只允許精確版本的優缺點是什么?

  1. Maven的沒有的方式來實現你所要求的。 即使您為直接依賴項設置了特定版本(您應該這樣做),由於看似無關的更改,您的傳遞依賴項也很容易被無意更改。 例如,在新庫上添加依賴項可以為您提供現有傳遞依賴項的舊版本。

    您需要的是有一個dependencyManagement部分,其中列出了您所有的直接和傳遞依賴項。 您仍然無法檢測是否刪除或添加了傳遞依賴項,這是 NPM 提供的功能。 丟失的問題是您的所有依賴項不再在dependencyManagement部分中。 要檢測這些更改,您可以使用我編寫的諸如dependency-lock-maven-plugin 之類的東西。 使用它還會使在dependencyManagement部分中擁有所有內容變得不那么重要,因為將檢測到傳遞依賴項的更改。

    我還建議在您的構建中使用https://maven.apache.org/enforcer/enforcer-rules/requireUpperBoundDeps.html ,因為 Maven 選擇在樹中關閉的傳遞依賴項的版本,而不是如您所料,最高版本。

    我見過許多由開發人員意外更改傳遞依賴項引起的運行時問題。

    TL;DR:您確實需要 Maven 中的鎖文件之類的東西,但由於歷史意識形態的原因,它不存在。

  2. 我不建議使用版本范圍,因為它們會使您的構建無法重現。 當涉及到傳遞依賴時,它的行為也不會像您所相信的那樣。

依賴鎖定是一個在 Gradle 5.0 中已經成熟的功能: https : //docs.gradle.org/current/userguide/dependency_locking.html

Gradle 的實現受到 Nebula 插件的啟發:https ://github.com/nebula-plugins/gradle-dependency-lock-plugin

當用作任何更新鎖定機制的輸入時,版本范圍運行良好。 因此,對於 Gradle,您實際上可以只針對特定的依賴項,這些依賴項將解決您指定的版本范圍:

gradle classes --update-locks org.apache.commons:commons-lang3,org.slf4j:slf4j-api

或者,您可以直接說“去更新我所有的 deps”:

gradle dependencies --write-locks

如果您正在研究自動化,則指定解析策略也值得審查: https : //docs.gradle.org/current/userguide/dependency_resolution.html

Maven、SBT 和 Gradle 都有你所描述的。 它被稱為“使用已發布(或固定)版本”。 與版本范圍[1.2.3,)或快照 ( 1.2.3-SNAPSHOT ) 相比,已發布版本看起來像1.2.3

如果您的所有依賴項都使用已發布的版本,那么您將實現所描述的內容。

版本范圍也是一種有效的版本形式,具體取決於您的用例,但我通常會建議不要使用它們,除非它們用於父POM -s,或僅在活躍開發期間使用。 當您不想繼續更新第三方或父 POM 的固定版本時,版本范圍會派上用場,如果您確定相應的工件不會對您造成任何破壞(並且,相信我,這在版本范圍內確實發生了很多)。 當您想保證代碼將根據您最初設計和測試的內容構建和工作時,應該使用固定版本。

如果您的pom.xml嚴格定義了依賴項的版本,則不需要具有諸如“鎖定文件”之類的功能或類似的功能。

如果您閱讀有關依賴項管理的文檔,您會發現確實如此:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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