将版本设置为最新版本,包括 Gemfile 中的预发布版本

Posted

技术标签:

【中文标题】将版本设置为最新版本,包括 Gemfile 中的预发布版本【英文标题】:Set version to latest version including prereleases in Gemfile 【发布时间】:2017-12-09 04:46:56 【问题描述】:

如何在 Gemfile 中指定版本约束,使其始终采用最新版本,包括 gem 的预发布版本。

目前我使用的库有最新的稳定版本2.0.0,以及最新的预发布版本2.1.0.alpha.pre.171

据我所知,我可以将版本约束设置为 >=2.1.0.alpha.pre.171 或只是 >=2.1.0.a。但这是否还包括未来的预发布​​版本,例如>=2.2.0.alpha.pre.1 甚至>=3.0.0.alpha.pre.1,以及未来的稳定版本,例如3.0.0?这是否总是会解决到最新版本?

免责声明: 不要被误解,这不适用于任何生产性依赖管理。我们的想法是运行一个演示,它应该始终包含最新的功能,并且如果最新的预发布版本被破坏,它也应该崩溃。

【问题讨论】:

【参考方案1】:

简而言之,这是一个非常糟糕的主意,但很容易检查:

%w|2.1.0.alpha.pre.171
   2.1.0
   2.2.0.alpha.pre.1
   3.0.0.alpha.pre.1|.map(&Gem::Version.method(:new)).sort
#⇒ [
#   [0] #<Gem::Version "2.1.0.alpha.pre.171">,
#   [1] #<Gem::Version "2.1.0">,
#   [2] #<Gem::Version "2.2.0.alpha.pre.1">,
#   [3] #<Gem::Version "3.0.0.alpha.pre.1">
# ]

所以,是的,&gt;= 将适用于任何新版本,包括 2.1.0

【讨论】:

我想这也将包括最新的未来稳定版本,与指定的预发布版本不同,主版本号不同。 (我在原始问题中添加了一个示例。) 能否请您重述问题?我明确地将稳定的2.1.0 版本放在那里以显示它在排序列表中的位置。【参考方案2】:

你需要做两件事:

    在您的 Gemfile 中指定 &gt;= 2.1.0.alpha.pre.171。这里重要的是,指定的约束本身就是一个预发布,这是使 Bundler 拾取您想要的预发布的唯一方法1。然后,当 Bundler 查找更新时,将包含所有未来版本,包括预发布版本和主要版本。

    使用自动化工具定期更新 Gemfile.lock。 Dependabot、Depfu 或 Deppbot 中的任何一个都可以。 (披露:我写了 Dependabot。)

令人惊讶的是,从 Bundler 1.15.1 开始,没有可以传递给 bundle update 的选项来复制 (1) 创建的行为。


    https://github.com/bundler/bundler/blob/v1.15.1/lib/bundler/index.rb#L194-L200

【讨论】:

以上是关于将版本设置为最新版本,包括 Gemfile 中的预发布版本的主要内容,如果未能解决你的问题,请参考以下文章

是否有一个sbt插件来获取像Gemfile中的依赖项?

Bundler:始终在 Gemfile 中使用最新版本的 git 分支

在 Gemfile 中设置 ruby​​ 版本

iTunes Connect 提交当前的预发布版本号

在 Gemfile 和 .ruby-version Dotfile 中列出 Ruby 版本是一种不好的做法吗?

您想告诉我为啥即使我将 bundler 更新为“2.2.21”,Gemfile.lock 中的 bundler 版本仍然是“2.2.16”吗?