Вызов сценария 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.