Rubygems没有提供一种适当的方式来为不同的Ruby版本指定不同的依赖关系。如果我们在gemspec中加入一个条件语句,就可以切换安装什么:
if RUBY_VERSION < "1.9"
# ruby 1.8 only supports nokogiri < 1.6
s.runtime_dependency "nokogiri", ">= 1.4.0", "< 1.6"
else
s.runtime_dependency "nokogiri", ">= 1.4.0"
end
但是,这并不能控制什么会被加载。如果在加载路径中有一个更新的版本,即使与 ruby 1.8 不兼容,它也会被加载。
我不确定这实际上是否是个问题:如果你使用 rbenv/rvm 等,那么每个 ruby 都有不同的 gem 路径,所以希望你永远不会在同一个地方安装两个版本。我认为即使标准 gem 路径也分为兼容版本 (1.8 / 1.9.1)。这是用来解决这个问题的吗? 或者你能否陷入同时安装两个版本的情况?
另一种方法是保持 gemspec 开放式(没有条件要求),并警告用户在他们的 Gemfile 中设置正确的版本约束条件。
哪种方式更可取?