从Ruby 2.0脚本调用Ruby 1.8脚本

时间:2013-11-19 21:21:21

标签: ruby gem rvm ruby-2.0 ruby-1.8

我不确定这是属于这里还是其他地方(超级用户?)但无论如何:

我有两个Ruby脚本,一个需要Ruby 2.0(A),另一个需要1.8(B)。需要使用分叉进程调用B. A是这样的:

require "fileutils"
require "json"

...

`name_of_B`

B是一个带有shebang的可执行脚本,从这样开始:

#!/Users/user_name/.rvm/rubies/ruby-1.8.7-p374/bin/ruby
require 'rubygems'
require 'json'

...

我使用RVM来管理我的Ruby版本:

> rvm list
rvm rubies

   ruby-1.8.7-p374 [ i686 ]
   ruby-1.9.3-p448 [ x86_64 ]
=* ruby-2.0.0-p247 [ x86_64 ]

我用A:

运行A.
> ruby name_of_A

但最终得到:

/Users/jacobevelyn/.rvm/gems/ruby-2.0.0-p247/gems/json-1.8.1/lib/json/ext/parser.bundle: [BUG] Segmentation fault
ruby 1.8.7 (2013-06-27 patchlevel 374) [i686-darwin12.5.0]

对我能做什么的任何想法?我不太了解宝石,但似乎B试图看看安装在Ruby 2.0下的宝石,而不是1.8。 (是的,我已经在1.8以下运行gem install json。)显然脚本比它们在这里出现的更复杂,绝对不能移植或组合(这并不意味着我不想要 to,这意味着我不能用于我的用例),否则我会。

2 个答案:

答案 0 :(得分:1)

呼叫:

result = `\path\to\ruby_1_8 \path\to\ruby_1_8_script.rb`

这将使用正确的ruby二进制文件来执行期望它的脚本。结果保存到var。


您可以致电which ruby查找当前目录中的ruby版本。转到你的项目/源目录并调用它来查看你用于主应用程序的版本(可能是Ruby 2)。然后,转到旧项目/ repo(与1.8脚本关联)并再次运行它。希望这将向您展示Ruby 1.8的路径。如果没有,请从root(/)尝试。或者使用RVM自信地切换到Ruby 1.8,然后在那里调用它来获取路径。


我从未使用过RVM。如果它被混淆,并通过错误的宝石集等过滤事物,那么您可能需要切换到rbenv。此外,您可能需要使用自己的函数来显示Ruby 1.8二进制文件的真实路径(也许它可能与which混淆?)同样,我没有RVM。

答案 1 :(得分:1)

你需要将shebang改为:

#!/Users/user_name/.rvm/wrappers/ruby-1.8.7-p374/ruby

它不仅会使用红宝石,还会使用它的宝石。

如果您使用bundler(Gemfile),您可能还需要将命令调用包装在:

Bundler.with_clean_env do
  ...
end

将重置加载的bundler环境