Come avviare un nuovo processo di zecca in Rails, senza variabili d'ambiente correnti ereditare?
-
25-09-2019 - |
Domanda
Sto sviluppando un maestro applicazione Rails che controlla altre applicazioni rotaie. Ha uno script bash per avviare quelle applicazioni Rails, e funziona bene, mentre viene invocato nella riga di comando manuale.
Ma se invoco in materia rotaie app, utilizzando backticks
, system
o exec
, lo script fallirà.
Il messaggio di errore è:
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
.>
E qui è il file bash:
cp configs/Gemfile* $1
cd $1
bundle
bundle exec unicorn_rails -c ../configs/unicorns/$1.rb -E production
Come risolvere un problema come questo?
Come si può vedere, io uso bundle exec
per avviare il processo figlio, che dovrebbe avere un proprio gemme caricato, giusto?
Soluzione
Le variabili d'ambiente sono passati dal sistema operativo a Ruby quando viene caricato. Rubino aggiunge le proprie variabili aggiuntive, quindi avvia Rails, che aggiunge ancora di più.
Si dovrebbe essere in grado di manipolarli giocando con l'hash ENV. Questo mostrerà quello che viene definito:
ENV.each { |key, val| puts "#{ key } => #{ val }"}
È possibile modificare ciò che è passato a processi figli modificando direttamente i valori ENV poi invocare il codice che inizia il bambino:
ENV['PATH'] = '/path/to/application'
ENV['PATH'] # => "/path/to/application"
Modifica il percorso, o strippaggio voci ENV indesiderate di limitare la conoscenza di un'applicazione figlio l'ambiente è piuttosto comune.