当前位置: 首页 > 知识库问答 >
问题:

Gemfile。Maven和gradle中的锁等价物

元英朗
2023-03-14

正如Maven(客户端)和IvyResolver(Gradle使用)一样,Bundler解决了配置文件(Bundler的Gemfile)中声明的库依赖关系。然而,在这之后,绑定器将依赖项解析保存在Gemfile上。锁它允许其他开发人员使用完全相同的库。

例如,Maven在依赖关系解决中使用了一种不明确的决定论方法来解决冲突。例如,将版本指定为。。。

<version>1.0.1</version>

不保证使用该版本。并将版本指定为。。。

<version>[1.0.0,2.0.0)</version>

给我们几乎没有保证。

是的,我可以手动编写列出的所有版本

mvn dependency:resolve

但是,有没有什么自动的方法可以做到这一点?

非常清楚的是:是否有任何等效于Gemfile的东西。锁定Maven还是Gradle?

Java开发人员,如果您不熟悉Gemfile。锁,捆扎机,请检查:

http://bundler.io/v1.3/rationale.html

重要的第一部分副本如下:

将代码签入版本控制

开发应用程序一段时间后,将应用程序与Gemfile和Gemfile一起签入。锁定快照。现在,您的存储库记录了您上次确定应用程序工作时使用的所有gem的确切版本。请记住,虽然您的Gemfile只列出了三个gem(具有不同程度的版本严格性),但一旦您考虑到您所依赖的gem的所有隐含要求,您的应用程序就依赖于几十个gem。

这很重要:Gemfile。lock使您的应用程序成为一个包含您自己的代码和上次运行的第三方代码的单一包,您可以确定这些代码都正常运行。在Gemfile中指定所依赖的第三方代码的确切版本并不能提供相同的保证,因为gems通常会为其依赖性声明一系列版本。

下次在同一台机器上运行bundle安装时,bundler将看到它已经具有您所需的所有依赖项,并跳过安装过程。

是的,对。如果您在pom中声明了一个版本。xml,maven使用它。但是,如果它是在父pom中声明的,那么这个担保就消失了。

依赖项中介-这决定了当遇到多个版本的工件时,将使用哪个版本的依赖项。目前,Maven 2.0只支持使用“最近的定义”,这意味着它将使用依赖关系树中与项目最接近的依赖关系的版本。您总是可以通过在项目的POM中显式声明来保证版本。请注意,如果两个依赖关系版本在依赖关系树中处于同一深度,则在Maven 2.0.8之前,没有定义哪一个版本会获胜,但由于Maven 2.0.9,则声明中的顺序才是最重要的:第一个声明获胜。

“最近的定义”表示使用的版本将是依赖关系树中与您的项目最接近的版本,例如,如果A、B和C的依赖关系定义为-

哦,看起来这是干燥原理的对立面。

共有3个答案

谭浩皛
2023-03-14

你在这里不正确。如果你明确表示

<version>1.0.1</version>

在pom中,可以保证此版本将用于可能使用不同版本的可传递依赖项。

丌官远
2023-03-14

锁定依赖项的解决方案是使用

您可以使用Pedanic Pom Enforcher插件强制执行此行为(以便只有父项目可以声明依赖版本)。您还可以使用执法者插件完全禁止所有传递依赖项或各种子集(我甚至不认为gradle或bundle具有这种级别的可配置性)。有些人真的很喜欢这种行为,因为您可以这样做,这样您就可以声明每个依赖项,这使您认识到您的应用程序/库可能是多么臃肿/耦合。

是的,这并没有那么枯燥,因为您基本上需要两次声明包(一次在dependencyManagement中,第二次在Dependency中没有版本)。如果您决定禁止所有及物,情况会更糟。您可以通过使用导入(即bom:bom表pom文件)和/或父pom来缓解干燥问题。像我这样的一些公司有一个主父pom,它具有每个项目正在使用的每个依赖项(因此在项目之间锁定库的版本)。记住,父级或导入的pom也可以进行版本控制!

至于gem lock文件行为,实际上没有任何类似的东西......它只是不像KISS(据说我被G严重烧伤了em.lock更喜欢maven/gradle方式......每个都有它的优点)。您可以根据maven依赖插件编写插件(即将分析的依赖项转储到文件中)。

阎扬
2023-03-14

星云。gradle依赖锁插件就是这样做的。

PS:Gradle不再使用Ivy了(如果这就是你所说的IvyResolver的意思)。

 类似资料:
  • 我是新来的,所以我有一些关于gradle的问题。在gradle之前,我使用过maven,在maven中有一些命令,例如 而且 ~=

  • 这个问题已经发布了等价的api测试依赖在Gradle?但我看不出有什么解决办法。 我们声明的依赖项很少,如下所示 我们想把这些暴露给这个库的消费者。由于是testImplementation,消费者需要显式地声明这些依赖关系,而这些依赖关系是我们想要避免的。

  • 我试图按照这里的说明,使用Gradle,用Kotlin和Java 11构建一个简单的JavaFX11程序。但是,这个页面使用的是Gradle的Groovy DSL,而我正在尝试使用Kotlin DSL。令人惊讶的是,我在谷歌搜索时没有找到一个文档,将每个Groovy构造映射到其等价的Kotlin构造,或者解释如何将Groovy DSL代码转换为等价的Kotlin DSL代码。(这似乎是Gradle

  • 使用maven,我可以创建一个项目,设置我的pom及其依赖项,使用main方法编写一个类,然后运行它,键入: 做这件事有什么好处? 我可以执行< code>gradle build,它为我构建了一个jar文件,但是如果主类对其他jar有任何依赖,那么不设置类路径,只运行jar是不行的。gradle java插件可以运行应用程序并为我设置类路径吗? 我正在寻找一个简单的一次性使用的命令行解决方案,而

  • 我是WPF技术的新手。我已经在WinForms开发了大约6年。 现在我想通过学习WPF来提高我的技能一大步。我正在阅读MSDN中的介绍指南,同时作为个人练习,我试图将WinForms UI的sructure转换为其WPF UI的等价物。 这是我想在WPF中重现的WinForms控件结构的简单模型: 我的问题:有人可以指导我或给我一个简短的例子,我如何可以添加一个下拉按钮的东西在工具栏?。