我经常遇到Gemfile指定获取gem的最新版本的问题,但考虑到我的系统的限制,我只是得到一个错误,因为最新版本与ruby不兼容。
例如,假设我有:
gem "my-gem", ">=1.2"
最新版本是1.5,但只有1.4版本适用于我的Ruby版本。安装1.4会更有意义,而不是产生错误,因为它符合我的要求并且可以使用我的工作。 (即Bundler应安装“所有依赖项满足的最新版本”,并在此版本低于Gemfile中指定的时间时产生错误)
实际上,Bundler的默认行为有效地强加了“> = 1.5”,即使这不是Gemfile所需要的。
有没有办法,除了手动更改Gemfile之外,捆绑器可以表现得很明智,只是尝试提供它有要求的宝石的最新版本?
更新
我同意使用~> x.x.x
是明智之举,但它并不像我所要求的那样做。 ~> x.x.x
具体说“只安装此版本加补丁;不要转到x.x + 1”。但这与“给我最新版本,我可以满足”
答案 0 :(得分:2)
从版本1.13开始,bundler确实尊重所需的ruby版本的gem。
为了让bundler解析正确的版本,您必须在Gemfile
本身中指定所需的ruby版本。这是必需的,因为指定的ruby版本会影响Gemfile.lock
中已解析的gems,它本身独立于正在运行的Ruby。
您可以在Gemfile
:
ruby "~> 2.1.0"
有关指定ruby
版本的详细信息和其他选项,请参阅bundler's documentation。该功能已在changelog for bundler 1.13中公布。
答案 1 :(得分:1)
gem "my-gem", "~>1.4.0"
或
gem "my-gem", '>= 1.4', '< 1.5'
应该这样做。
说明符〜&gt;具有特殊意义,通过实例最佳显示。 〜&GT; 2.0.3与&gt; = 2.0.3相同且&lt; 2.1
和article:
gem('nokogiri','&gt; = 1.0.0','&lt; 2.0.0')
这意味着您将从1.0.0开始使用任何版本的Nokogiri 但不是2.0.0或更高。