【发布时间】:2014-11-19 12:28:58
【问题描述】:
作为 Maven(客户端)和 IvyResolver(Gradle 使用),Bundler 解决了在配置文件(Gemfile for bundler)上声明的库依赖关系。然而,在那之后,Bundler 将依赖解析保存在 Gemfile.lock 上。它允许其他开发人员使用完全相同的库。
例如,Maven 使用确定器通过不明确的方式来解决依赖关系解析中的冲突。例如,将版本指定为 ...
<version>1.0.1</version>
不保证将使用该版本。并将版本指定为 ...
<version>[1.0.0,2.0.0)</version>
几乎不给我们任何保证。
是的,我可以手动编写
列出的所有版本mvn dependency:resolve
但是,有没有自动的方法可以做到这一点?
非常清楚:在 Maven 或 Gradle 中有没有与 Gemfile.lock 等效的东西?
Java开发者,如果对Gemfile.lock、Bundler不熟悉,请查看:
http://bundler.io/v1.3/rationale.html
下面我复制的重要部分:
将您的代码检查到版本控制中
在开发您的应用程序一段时间后,签入 应用程序连同 Gemfile 和 Gemfile.lock 快照。现在, 您的存储库记录了所有 gem 的确切版本 你最后一次使用你确定的应用程序 工作。请记住,虽然您的 Gemfile 仅列出了三个 gem (具有不同程度的版本严格性),您的应用程序取决于 在几十颗宝石上,一旦你考虑到所有的 您所依赖的宝石的隐含要求。
这很重要:Gemfile.lock 使您的应用程序成为一个单一的 你自己的代码和它最后运行的第三方代码的包 时间你肯定知道一切正常。指定确切 您在 Gemfile 中依赖的第三方代码的版本会 不提供相同的保证,因为 gems 通常会声明一个范围 它们的依赖项的版本。
下次您在同一台机器上运行 bundle install 时,bundler 将 看到它已经拥有你需要的所有依赖项,然后跳过 安装过程。
“你说的不对。Maven可以保证版本”
是的,没错。如果你在 pom.xml 中声明了一个版本,maven 会使用它。但是,如果它在父 pom 中声明,则此保证将消失。
依赖中介——这决定了当遇到工件的多个版本时将使用哪个版本的依赖。目前,Maven 2.0 仅支持使用“最近定义”,这意味着它将使用依赖树中与您的项目最接近的依赖版本。您始终可以通过在项目的 POM 中明确声明来保证版本。请注意,如果两个依赖版本在依赖树中的深度相同,则在 Maven 2.0.8 之前没有定义哪个会获胜,但从 Maven 2.0.9 开始,声明中的顺序很重要:第一个声明获胜。
“最近的定义”意味着使用的版本将是依赖树中最接近您的项目的版本,例如。如果 A、B 和 C 的依赖项定义为 A -> B -> C -> D 2.0 和 A -> E -> D 1.0,则在构建 A 时将使用 D 1.0,因为从 A 到 D 的路径通过E 更短。您可以在 A 中显式添加对 D 2.0 的依赖项以强制使用 D 2.0
哦,看起来这与 DRY 原理相反。
【问题讨论】:
-
什么时候不能保证使用那个版本
<version>1.0.1</version> -
@khmarbaise,请阅读我对小发明答案的评论。