有没有办法在 运行 捆绑包安装之前获得 gem 的版本(来自 Gemfile.lock)

Is there a way to get a gem's version before running bundle install (from Gemfile.lock)

我想获得 Gem 的版本,但没有 运行 捆绑安装。 也就是说我想弄清楚计划安装什么版本的包而不实际安装 gem。 假设从 Gemfile.lock(和 Gem 文件)合并读取它。

有什么方法可以解决捆绑程序计划安装的版本?

我需要这个,因为我想在 运行 docker 构建时缓存昂贵的安装。

Gems like rails(nokogiri) 需要一段时间来安装,我想做 gem install rails -v ... 运行 捆绑包安装之前的步骤。

为此,我需要先获取 rails 版本

如果您将新的 gem 添加到 gem 文件,但没有添加 bundle install,它还不会安装。相反,您可以 运行 bundle lock,这会生成一个新的锁定文件。这包括将要安装的新 gem 的 gem 版本。 通过 运行ning bundle show new_gem,它表明它实际上并没有安装。

为了确保在 运行 执行命令之前可能会备份原始 Gemfile.lock

默认情况下,如果 Gemfile 中未指定版本,运行ning bundle install 将尝试安装与其余 gem 兼容的最新版本 gems 和 ruby 版本在您的项目中。这将创建一个 Gemfile.lock 文件(如果尚不存在)。如果 Gemfile.lock 文件已经提交到 git 存储库,则它应该安装 Gemfile.lock 中指定的版本。捆绑器的要点是处理依赖关系以确保您的堆栈正常工作。

要查看当前正在使用的 gem 捆绑器的版本,您可以 运行

bundle show rails

例如,您可能希望在 Gemfile 中指定 ruby 版本

ruby '~> 2.5'  #

您可以像这样在 Gemfile 中指定 gem 的确切版本,只要它与堆栈的其余部分兼容,您就应该能够依赖它作为版本捆绑器将安装的版本。如果 gem 版本不兼容,bundle install 将抛出错误。

gem 'rails', '4.2.11' # this will always install only this version.

您也可以使用悲观运算符 (~>) 来设置只进行较小的更新

gem 'influxdb', '~> 0.6.1' # could go to 0.6.2 but never 0.7.0

您也可以像这样设置最低版本,尽管这可能不是您的问题所需要的。

gem 'pg_query', '>= 0.9.0'

如果您的存储库中已有 Gemfile.lock,您可以看到 运行ning 将安装哪个版本,例如:

gem show rails

这会告诉你版本和当前安装与否。

有关详细信息,请参阅 bundle --help