Как начать новый процесс в Rails, без наследства текущих средств среды?
-
25-09-2019 - |
Вопрос
Я разрабатываю приложение Master Rails, которое контролирует другие приложения Rails. Он имеет сценарий Bash для начала этих приложений Rails, и он хорошо работает, пока он вызывается в командной строке вручную.
Но если я вызову это в приложении Rails, используя backticks
, system
, или exec
, Сценарий потерпит неудачу.
Сообщение об ошибке:
unicorn_rails worker[0] -c ../configs/unicorns/c5.rb -E production must be run inside RAILS_ROOT:
#<Gem::LoadError: can't activate rack (~> 1.0.0, runtime), already activated rack-1.2.1.
Make sure all dependencies are added to Gemfile
.>
А вот файл bash:
cp configs/Gemfile* $1
cd $1
bundle
bundle exec unicorn_rails -c ../configs/unicorns/$1.rb -E production
Как решить эту проблему?
Как вы можете видеть, я использую bundle exec
Чтобы начать детский процесс, который должен иметь свои собственные драгоценные камни загружены, верно?
Решение
Переменные среды передаются ОС для рубины, когда она загружается. Ruby добавляет свои дополнительные переменные, затем начинает рельсы, которые добавляют еще больше.
Вы должны уметь манипулировать их, играя с Env Hash. Это отобразит то, что определено:
ENV.each { |key, val| puts "#{ key } => #{ val }"}
Вы можете настроить то, что передается до дочерних процессов, непосредственно изменив значения env, то вызывая код, который запускает ребенка:
ENV['PATH'] = '/path/to/application'
ENV['PATH'] # => "/path/to/application"
Изменение пути или зачистки нежелательных записей ENV для ограничения знаний о детском приложении об окружающей среде довольно распространено.