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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top