最近,在阅读 NPM、Yarn、Paket、Cargo 等包管理器时,我了解到依赖版本锁定文件的概念。我的理解是,它是一个列出所有直接和传递依赖项及其确切依赖项的文件。版本号,因此保证后续构建使用一组等效的依赖项。这似乎是一个理想的功能,因为许多包管理器已经或正在采用这个概念。
我的问题是:
为什么 Maven 或 Gradle 不使用锁定文件?或者如果他们看到了,为什么我没看到呢?
在包管理器的依赖项解析策略中允许版本范围与仅允许精确版本相比有何优缺点?
-
Maven 确实not有办法实现你所要求的。即使您为直接依赖项设置了特定版本(您应该这样做),您的传递依赖项也很容易由于看似不相关的更改而被无意中更改。例如,添加对新库的依赖关系可以为您提供现有传递依赖关系的旧版本。
你需要的是有一个dependencyManagement
列出所有直接和传递依赖项的部分。您仍然无法检测是否删除或添加了传递依赖项,这是 NPM 等提供的功能。缺少它的问题是你的所有依赖项都不再在dependencyManagement
部分。要检测这些变化,你可以使用类似的东西依赖锁 maven 插件 https://github.com/vandmo/dependency-lock-maven-plugin这是我写的。使用它也会让把所有东西都放在一个盒子里变得不那么重要了dependencyManagement
部分,因为将检测到传递依赖项的变化。
我还建议有https://maven.apache.org/enforcer/enforcer-rules/requireUpperBoundDeps.html https://maven.apache.org/enforcer/enforcer-rules/requireUpperBoundDeps.html在您的构建中,因为 Maven 选择树中关闭的传递依赖项的版本,而不是如您所期望的最高版本。
我见过许多由于开发人员意外更改传递依赖项而导致的运行时问题。
长话短说:你doMaven 中需要类似锁定文件的东西,但由于历史意识形态原因,它并不存在。
-
我不建议使用版本范围,因为它们会使您的构建不可重现。
当涉及到传递依赖时,它的行为也不像您所相信的那样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)