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

时间:2019-04-03 11:21:02

标签: ruby-on-rails ruby bundle

我想在不运行安装包的情况下获得Gem的版本。 这就是说,我想弄清楚计划在不实际安装gem的情况下安装哪个版本的软件包。 说从合并的Gemfile.lock(和Gemfile)中读取它。

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

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

像rails(nokogiri)这样的宝石需要花费一些时间来安装,我想在运行捆绑安装之前的上一步中进行gem install rails -v...。

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

2 个答案:

答案 0 :(得分:1)

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

尽管可以确保在运行命令之前获得原始Gemfile.lock的备份。

答案 1 :(得分:1)

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

要查看当前使用的宝石捆绑包的版本,可以运行

bundle show rails

例如,您可能需要在Gemfile中指定红宝石版本

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,则可以通过运行以下命令查看要安装的版本:

gem show rails

哪个会显示您的版本,以及是否安装了当前版本。

有关更多信息,请参见bundle --help