如何向gem规范添加条件rubygem要求?

是否可以仅在该人使用特定版本的ruby时添加gem依赖项?

背景:我正在使用Test :: Unit :: Autorunner等项目的fork 。 它们是ruby 1.8中标准库的一部分,但不是1.9.1中标准库的一部分,而是在“test-unit”gem中。 我想添加一个依赖项,说如果有人使用ruby 1.9.1或更高版本,安装“test-unit”gem,但如果他们使用1.8或更早版本,则不需要安装任何东西。

如果你看一下add_dependency的gemspec文档 ,就没有ruby版本的选项。 也许你可以使用post_install_message属性告诉用户如果他们使用ruby 1.9就安装gem。

Gem不支持条件依赖(除了gem builder的环境 – 如上所述),而bundler也不是解决这个问题的可行选择 – 请参阅https://github.com/carlhuda/bundler/issues/1281

我为一个项目做了这件事。 诀窍是将脚本添加为扩展,然后在安装时在用户的计算机上执行。

这是代码片段和我们的github链接:

首先,在gemspec中(我们实际上是使用Rakefile来生成它,但结果却相同)

# This file *needs* to be named this, there are other files # for other extension processors s.extensions << 'ext/mkrf_conf.rb' 

然后是mkrf_conf.rb 源代码中的相关行

 require 'rubygems/dependency_installer.rb' inst = Gem::DependencyInstaller.new inst.install "test-unit" if RUBY_VERSION > "1.9" 

干草…我是一个ruby新手…如果这是最好的方式。

任何方式…我希望我只使用Ruby来做到这一点….虽然你可以使用你的操作系统shell来做到这一点,在程序安装程序中使用它,只需执行(适用于基于Linux的操作系统):

 $ruby --version 

(你可以从ruby安装程序文件执行,就像: ruby --version )并根据输出提出一个可能性,如果它是1.9.1添加额外的行来执行:

 $ sudo gem install gem_name 

别的,就这样吧。

在这里结帐有点教程: http : //wiki.github.com/rdp/ruby_tutorials_core/gem

它显示了如何根据installee使用的ruby版本安装不同版本的依赖项。

(简短的回答 – 它不是那么容易)

你不能。 你需要建立两个gem,一个用

 spec.required_ruby_version = '~> 1.8.6' 

和一个

 spec.required_ruby_version = '~> 1.9.1' spec.add_dependency 'test-unit', '~> 2.0.5' 

无论如何,Gemspecs只是ruby文件,所以你可以在其中执行任何ruby代码,所以:

 spec.add_dependency = 'test-unit', '>= 2.0' if RUBY_VERSION =~ '1.9' 

编辑:规范仅在构建器计算机上运行。