2017-06-13 83 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 *部分... –