Вызов сценария Ruby 1.8 из сценария Ruby 2.0

Я не уверен, принадлежит ли это здесь или где-то еще (SuperUser?), Но в любом случае:

У меня есть два сценария Ruby, один из которых требует Ruby 2.0 (A), а другой - 1.8 (B). А нужно вызвать Б с разветвленными процессами. А это что-то вроде этого:

require "fileutils"
require "json"

...

`name_of_B`

B - исполняемый скрипт с шебангом, начинающийся так:

#!/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 ]

Я бегу с:

> 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. (Да, я бегу gem install json до версии 1.8 уже.) Очевидно, что сценарии более сложны, чем кажутся здесь, и абсолютно не могут быть перенесены или объединены (это не означает, что я не хочу, это означает, что я не могу для моего случая использования), иначе я бы,

2 ответа

Решение

Вам нужно изменить шебанг на:

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

он будет использовать не только этот рубин, но и его драгоценные камни.

в случае, если вы используете bundler (Gemfile), вам также может понадобиться обернуть вызов команды в:

Bundler.with_clean_env do
  ...
end

который сбросит загруженную среду

Вызов:

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

Это будет использовать правильный двоичный файл ruby ​​для выполнения сценария, который ожидает его. Результат сохраняется в var.


Ты можешь позвонить which ruby чтобы найти версию рубина в вашем текущем каталоге. Перейдите в директорию вашего проекта / источника и вызовите ее, чтобы увидеть версию (предположительно Ruby 2), которую вы используете для основного приложения. Затем перейдите к своему старому проекту / репо (связанному со скриптом 1.8) и запустите его снова. Надеюсь, это покажет вам путь к Ruby 1.8. Если нет, попробуйте от рута (/). Или используйте RVM, чтобы уверенно переключиться на Ruby 1.8, а затем вызвать его, чтобы узнать путь.


Я никогда не использовал RVM много. Если он сбит с толку и фильтрует вещи по неверному набору гемов и т. Д., То вместо этого вам может потребоваться переключиться на rbenv. Кроме того, вам может понадобиться использовать его собственные функции для отображения истинного пути к бинарному файлу Ruby 1.8 (т.е., возможно, он портится с which?) Опять же, я не RVM.

Другие вопросы по тегам