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

我想要的是这样的:

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

因此,当gem需要不同版本的机架时,它们都是平庸的。 这可能吗?

您可以设置允许的gem间隔

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

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

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

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

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

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

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

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

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