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 中设置正确的版本约束。
哪种方式更可取?