你能在Gemfile中拥有多个版本的gem吗?

时间:2011-09-19 19:29:24

标签: ruby rubygems bundler

我想要的是这样的:

gem 'rack', '1.3.3', '1.2.4'

因此,当宝石需要不同版本的机架时,它们都会被安抚。这可能吗?

3 个答案:

答案 0 :(得分:13)

不,您无法同时加载多个gem版本。这是因为,当knut突出显示时,代码会发生冲突。宝石如何知道使用Rack的1.2.4版本而不是1.3.3版本的Rack?它不能。

另外:使用Bundler,必须满足所有gem依赖项才能完成捆绑过程。如果你有一个明确要求 Rack 1.2.4的宝石(即= 1.2.4在该宝石的gemspec中),那么另一个需要Rack版本的宝石如>= 1.3然后这些宝石版本会发生冲突,而Bundler会告诉你。

答案 1 :(得分:11)

您可以设置允许的宝石间隔

gem 'rack', '<1.3.3', '>1.2.4'

它将在所选的intervall中加载最实际的一个。

但我认为你不能要求不同的宝石版本。 如果gem将以不同的版本加载,则每个类和模块必须获得它自己的命名空间,以避免覆盖gem的方法。

答案 2 :(得分:3)

我遇到了这个问题,因为我想将某些破损的上游宝石版本列入黑名单。虽然你做不到

gem 'rack', '1.3.3', '1.2.4'

可以有多个!=约束来排除你知道存在问题的版本:

gem 'rack', '!= 1.3.0.beta2', '!= 1.3.0.beta'