我正在寻找一种方法来为所有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
。
答案 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)让你的命令显式调用bash
或zsh
(sh
在我的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