Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bundler能否根据我的ruby版本(或受其他依赖项的限制)自动安装最新版本?_Ruby_Rubygems_Bundler - Fatal编程技术网

bundler能否根据我的ruby版本(或受其他依赖项的限制)自动安装最新版本?

bundler能否根据我的ruby版本(或受其他依赖项的限制)自动安装最新版本?,ruby,rubygems,bundler,Ruby,Rubygems,Bundler,我经常遇到这样一个问题:Gemfile指定获取gem的最新版本,但是由于我的系统的限制,我只会得到一个错误,因为最新版本与ruby不兼容 例如,假设我有: gem "my-gem", ">=1.2" 最新版本是1.5,但只有1.4版本才能与我的Ruby版本一起使用。与其产生错误,不如安装1.4,因为它符合我的要求,并且可以使用我现有的工具。(即,Bundler应安装“所有依赖项都满足的最新版本”,并在该版本低于文件中指定的版本时产生错误) 事实上,bundler的默认行为实际上强加了“>

我经常遇到这样一个问题:Gemfile指定获取gem的最新版本,但是由于我的系统的限制,我只会得到一个错误,因为最新版本与ruby不兼容

例如,假设我有:

gem "my-gem", ">=1.2"
最新版本是1.5,但只有1.4版本才能与我的Ruby版本一起使用。与其产生错误,不如安装1.4,因为它符合我的要求,并且可以使用我现有的工具。(即,Bundler应安装“所有依赖项都满足的最新版本”,并在该版本低于文件中指定的版本时产生错误)

事实上,bundler的默认行为实际上强加了“>=1.5”,即使这不是Gemfile所要求的

除了手动更改gem文件外,bundler还有什么方法可以明智地提供符合要求的gem的最新版本吗


更新:

我同意使用
~>x.x.x
是一种明智的做法,但它与我所要求的并不相同
~>x.x.x
特别指出“只安装此版本及修补程序;不要转到x.x+1”。但这与“给我最新的版本,我可以满足的依赖性”

gem“我的gem”、'>=1.4'、'<1.5'
应该这样做

从:

说明符~>有一个特殊的含义,最好通过示例来说明。~> 2.0.3与>=2.0.3和<2.1相同

这是:

gem('nokogiri','>=1.0.0','<2.0.0')

这意味着您将从1.0.0开始使用任何版本的Nokogiri 但不是2.0.0或更高版本


从版本1.13开始,bundler就尊重所需的ruby版本的gems

为了bundler解析正确的版本,您必须在
Gemfile
本身中指定所需的ruby版本。这是必需的,因为指定的ruby版本会影响
Gemfile.lock
中已解析的gem,它本身独立于正在运行的ruby

您可以在
Gemfile
中这样定义所需的ruby版本:

ruby "~> 2.1.0"

有关指定
ruby
版本的详细信息和其他选项,请参阅。该特性是在.

中宣布的。我认为,如果gem规范中描述了与Ruby版本不兼容的版本,那么Bundler将排除这些版本。但情况并非总是如此。当您知道
1.5
与您的Ruby版本不兼容时,为什么不直接使用
gem“我的gem”和“<1.5”
?顺便说一句,
spec.required\u ruby\u版本是否在gem的gempec中配置?
~>1.4
=1.4
<2.0
相同。这不包括OP的要求。~>的问题是它没有做与我所问的相同的事情。~>特别是说“只安装这个版本加上补丁”(我同意GemFile通常是这样指定的)。但这与“给我最新的版本,我可以满足依赖关系”不同,~>的问题在于它与我所要求的不一样。~>特别是说“只安装这个版本加上补丁”(我同意GemFile通常是这样指定的)。但这与“给我一个我可以满足依赖关系的最新版本”不同。请注意,指定gem版本(这是另一个答案所涉及的)和指定所需的Ruby版本(这是我在这里讨论的)之间的区别。当您在
Gemfile
中指定您的Ruby版本,并且您的gem在其gempec中指定其
require\u Ruby\u version
时,bundler将自动找到符合Ruby要求的gem版本。因此,它可能不会尝试使用您的gem版本1.5。感谢您指出这一点。(虽然我还没有测试过这一点,)有没有办法在命令行中指定它?理想情况下,我希望有一种方法可以做到这一点,而无需修改从另一个源收到的代码。
gem "my-gem", '>= 1.4', '< 1.5'
ruby "~> 2.1.0"