Kernel.system вызов с рельсов - PullRequest
       18

Kernel.system вызов с рельсов

3 голосов
/ 28 февраля 2012

Я вызываю скрипт оболочки, используя Kernel.system из моего контроллера Rails. Сценарий оболочки может вызывать другой сценарий Ruby на основании некоторых условий. Этот скрипт на Ruby требует твиттера. Мое приложение Rails работает в Apache, используя Passenger. Теперь, когда этот скрипт Ruby вызывается из моего приложения Rails, я получаю следующую ошибку в журналах apache.

/var/www/webapps/test/twitter/twitter_post.rb:2:in `require': no such file to load -- twitter (LoadError)
        from /var/www/webapps/test/twitter/twitter_post.rb:2

Тот же скрипт Ruby прекрасно работает из оболочки Linux. Теперь, если я перечислю драгоценный камень twitter в моем Gemfile, он отлично работает. Kernel.system должен вызывать команды в подоболочке, поэтому Rails изменяет какие-либо переменные окружения в своей оболочке выполнения?

Ответы [ 2 ]

3 голосов
/ 28 февраля 2012

Subhell имеет ту же среду, что и процесс, который ее породил, поэтому здесь происходит все правильно, поскольку Bundler перезаписывает путь загрузки Ruby своим собственным, чтобы обеспечить загрузку только драгоценных камней в Gemfile.

Если ваше приложение зависит от того, запущен ли этот процесс, и этот процесс зависит от драгоценного камня twitter, почему его нет в вашем Gemfile?Кроме того, почему вы в первую очередь выполняете Ruby в подоболочке от Ruby?Обычно нет причин, по которым вы не должны просто иметь этот Ruby-код в своем приложении.

1 голос
/ 28 февраля 2012

вы не должны делать системный вызов другого сценария ruby, вам следует требовать или включать содержимое другого сценария ruby.

При этом ваша текущая среда rubygems при вызове сервера rails будетбыть тем из пакета приложения рельсов.Если в комплект приложения rails не входят гемы, необходимые для вашего другого сценария ruby, то ваш другой сценарий ruby ​​не сможет запросить эту библиотеку.

Итак, добавьте в Gemfile своего приложения rails библиотеку, которуюдругой скрипт жалуется, что он отсутствует, и я думаю, что это должно сделать ya.

В вашем внешнем скрипте ruby ​​попробуйте:

require 'bundler/setup'

взято из документация по настройке компоновщика

...