2017-06-13 124 views
0

在閱讀NPM,Yarn,Paket,Cargo等包管理器時,我最近已經介紹了依賴版本鎖定文件的概念。我的理解是,它是一個文件,它列出了所有直接和傳遞依賴關係它們的確切版本號,以便後續構建保證使用一組等效的依賴項。這似乎是一個理想的功能,因爲許多軟件包管理者已經或正在採用這個概念。爲什麼Gradle或Maven沒有依賴版本鎖定文件?

我的問題是,那麼:

  1. 爲什麼不Maven的或搖籃使用鎖文件?或者如果他們這樣做,爲什麼我沒有看到它?

  2. 在包管理器的依賴關係解析策略中允許版本範圍vs只允許精確版本有什麼優點和缺點?

+3

如果你在你的POM中定義的版本文件的依賴關係樹總是相同的,這意味着你不需要定義所有的傳遞依賴關係,並且你節省了很多工作。除非在Maven中使用版本範圍(這會導致不可重現的構建,對於所有其他構建系統也是如此)。 – khmarbaise

+0

也許如果你可以詳細說明或改寫你的評論。人們似乎認爲這是一個有用的評論,但我很難看到它如何回答我的問題。 – jrahhali

+0

簡單的答案是:Maven,Gradle等已經實現了這個並不是一個明確的文件,而是基於一個依賴樹的思想,它總是以同樣的方式進行迭代,這意味着樹總是有相同的版本,這意味着最終你不需要一個文件來定義它們的版本中的所有傳遞性和非傳遞性依賴關係(BTW:Maven在10年前的Maven 1.X中有一個定義文件中的所有內容的概念)... – khmarbaise

回答

0

兩個Maven的,SBT和搖籃有你描述。它被稱爲「使用發佈(或固定)版本」。與版本範圍[1.2.3,)或快照(1.2.3-SNAPSHOT)相比,發佈的版本看起來像1.2.3

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

版本範圍也是一種有效的版本形式,具體取決於您的使用情況,但我通常會建議您不要這樣做,除非它們用於父項POM -s,或者僅在積極開發期間使用。如果您確定相應的工件不會爲您破壞某些東西(並且信任它們),那麼當您不想更新第三方固定版本或父POM時,版本範圍可能非常方便我,這在版本範圍中發生了很多)。如果您希望確保代碼的構建和工作與您最初設計和測試的內容相符,則應使用固定版本。

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

如果你讀了關於依賴管理的文檔,你會看到,的確是這樣:

+0

好,預先後續問題:Maven Central Repository(或其他人)中存在的包是否允許在它們的pom.xmls中定義* their * dependencies的版本範圍? – jrahhali

+0

我不能100%肯定地說,但我會承認不。看看這些鏈接:http://central.sonatype.org/pages/releasing-the-deployment.html#releasing-deployment-from-ossrh-to-the-central-repository-introduction,http:// central .sonatype.org/pages/requirements.html和http://books.sonatype.com/mvnref-book/reference/pom-relationships-sect-project-dependencies.html – carlspring

+2

它允許版本範圍依賴於一個項目(例如jar)被部署到Maven Central。但這是你應該注意的一點,作爲一個維護者,這個定義使得你自己的用戶的構建和構建不可複製......除此之外,如果你想更新你的依賴關係等等,有一些工具可以處理沒有使用版本範圍... – khmarbaise

1

爲什麼不Maven的或搖籃使用這樣的事情?

他們有。

或者如果他們這樣做,爲什麼我沒有看到它?

因爲您沒有閱讀過文檔?

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

只是爲了記錄:https://docs.gradle.org/current/userguide/artifact_dependencies_tutorial.html - khmarbaise

+2

僅供記錄:https: //docs.gradle.org/current/userguide/artifact_dependencies_tutorial.html – khmarbaise

+0

我覺得這根本不能回答我的問題,顯然,我的問題還不夠清楚。我知道你列出的文件。我的問題不是關於Gradle和Maven如何處理依賴關係解決方案。我的問題是關於爲什麼Gradle和Maven不需要鎖定文件。 – jrahhali

+0

@jrahhali:*「我的問題是關於爲什麼Gradle和Maven不需要鎖定文件。」* - 因爲它們具有文檔中描述的* dependencyManagement *部分... –