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

时间:2009-10-25 08:22:18

标签: ruby rubygems

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

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

7 个答案:

答案 0 :(得分:2)

如果查看gemspec documentation for add_dependency,则无法选择ruby版本。也许您可以使用post_install_message属性告诉用户在使用ruby 1.9时安装gem。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

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

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

然后是mkrf_conf.rb source

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

答案 3 :(得分:0)

干草......我是一个红宝石新手......如果这是最好的方式。

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

$ruby --version

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

$ sudo gem install gem_name

否则,就这样吧。

答案 4 :(得分:0)

在这里查看一些有点教程: http://wiki.github.com/rdp/ruby_tutorials_core/gem

它显示了如何安装不同版本的依赖项,具体取决于installee正在使用的ruby版本。

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

答案 5 :(得分:-1)

你做不到。你需要建立两个宝石,一个用

spec.required_ruby_version = '~> 1.8.6'

和一个

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

答案 6 :(得分:-1)

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

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

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

相关问题