使用单个命令运行RSpec以获取多个Ruby版本

时间:2016-05-17 07:44:15

标签: ruby testing rspec

我正在寻找一种方法来为所有ruby版本运行'rake spec'。

到目前为止,我在Rakefile中编写了这段代码,但它不起作用:

RUBIES = ['ruby-2.0.0', 'ruby-2.1.1', 'ruby-2.2.1']

RUBIES.each do |ruby_v|
  sh "rvm use #{ruby_v}"
  RSpec::Core::RakeTask.new(:spec)
end

任何想法我怎么能做到这一点?

如果我可以传递参数来指定我是要运行单个ruby版本的测试还是所有版本,那将会很棒。

修改

Here's我使用的Rakefile和我得到的错误。它与我在顶部提到的文件不同。它在答案中使用了Keith建议的rvm use #{ruby_v}; rspec spec

1 个答案:

答案 0 :(得分:2)

rvm是一个shell命令,它的Ruby设置仅适用于shell的当前实例。因此,当您运行sh "rvm use #{ruby_v}"时,您需要更改已调用的shell的rvm版本,然后退出该shell。

此外,您的Ruby程序是运行Ruby虚拟机的操作系统进程,因此当您调用RSpec::Core::RakeTask.new(:spec)时,您仍然处于相同的操作系统进程和您使用的Ruby版本开始你的剧本。

您需要在调用的shell中运行rspec测试并更改Ruby版本。我觉得这样的事情会奏效:

`rvm use #{ruby_v}; rspec spec`

......但正如你所指出的那样,它没有。您需要将新shell作为"登录shell"这样rvm设置正确。此外,必须告诉新shell你要调用的东西是shell命令而不是脚本或二进制可执行文件。换句话说:

1)让你的命令显式调用bashzshsh在我的Mac上不适合我。)

2)指定(可能是-l)它是一个登录shell。

3)指定(可能是-c)您正在执行shell命令(rvm)而不是脚本或可执行文件。

我使用zsh作为我的shell,但您应该能够在下面的代码中替换bash并且它应该可以工作(当然还有你的rspec命令):

2.3.0 :024 > puts `zsh -lc "rvm current"`
ruby-2.3.0
 => nil
2.3.0 :025 > puts `zsh -lc "rvm use jruby; rvm current"`
Using /Users/kbennett/.rvm/gems/jruby-9.0.5.0
jruby-9.0.5.0
 => nil
2.3.0 :026 > puts `zsh -lc "rvm current"`
ruby-2.3.0
 => nil