繁体   English   中英

使用单个命令为多个Ruby版本运行RSpec

[英]Run RSpec for more than one Ruby version using single command

我一直在寻找一种对所有红宝石版本运行“ 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版本还是针对所有Ruby版本运行测试,那就太好了。

编辑:

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

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

另外,您的Ruby程序是一个运行Ruby虚拟机的操作系统进程,因此,当您调用RSpec::Core::RakeTask.new(:spec) ,您仍处于同一OS进程和Ruby版本中通过它启动脚本。

您需要在调用的Shell中运行rspec测试并更改Ruby版本。 我认为这样会起作用:

`rvm use #{ruby_v}; rspec spec`

...但是正如您所指出的,事实并非如此。 您需要将新的外壳程序作为“登录外壳程序”运行,以便正确设置rvm。 此外,必须告知新的Shell,您正在调用的东西是Shell命令,而不是脚本或二进制可执行文件。 换一种说法:

1)让您的命令显式调用bashzsh (在Mac上sh对我不起作用)。

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

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

我使用zsh作为我的外壳,但是您应该能够在下面的代码中替换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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM