2013-03-17 7 views
6

C'è un modo per ottenere informazioni sull'attuale ambiente Rack in Rake? Ad esempio, come posso sapere se Rack è in esecuzione nella modalità development o production?Come ottenere l'attuale ambiente Rack in Rake?

Capisco che Rake non sia consapevole del rack. Sto cercando di evitare la replica del codice in attività Rake quasi identiche tra gli ambienti di produzione e di sviluppo.

+0

http://stackoverflow.com/questions/2715035/rails-env-vs-rails-env – ted

+1

@ted, il collegamento riguarda l'utilizzo dell'ambiente rack in Rails e non menziona nulla di rake. Come si applica? –

+0

Si prega di visualizzare queste diverse attività Rake. Forse possiamo aiutarti se vediamo del codice. – robkuz

risposta

5

Come altra variabile ambiente, è possibile recuperarlo utilizzando:

ENV['RACK_ENV'] 

Considerando che è un'applicazione Sinatra, e di aver impostato l'ambiente in config/environment.rb, è possibile aggiungere quanto segue al Rakefile:

task :environment do 
    require File.expand_path('config/environment', File.dirname(__FILE__)) 
end 

task :your_task => :environment do 
    # task 
end 

Quindi, è possibile recuperare l'ambiente (a seconda di come lo si imposta nel vostro environment.rb) con ENV['RACK_ENV'] o Sinatra::Application.environment.

considerando non esiste un file di configurazione config/environment.rb, solo il file dell'applicazione, per esempio hello_world.rb, le seguenti opere:

hello_world.rb:

require 'sinatra' 

set :environment, :production 

get '/' do 
    'Hello World' 
end 

Rakefile:

task :environment do 
    require File.expand_path('hello_world', File.dirname(__FILE__)) # your Sinatra app 
end 

task :your_task => :environment do 
    puts Sinatra::Application.environment 
end 

Quando si esegue rake your_task si dovrebbe ottenere:

> rake your_task 
production 
+0

Non funziona. Ecco un semplice Rakefile per illustrare: 'task: test_rack_env do puts ENV ['RACK_ENV'] fine' Stampa una riga vuota. –

+0

Dove si imposta l'ambiente Rack su 'production' o' development'? – toch

+0

Sto usando Sinatra, quindi imposta l'ambiente. –

6

La domanda è vecchia ma non è mai stata trovata la risposta alle migliori pratiche o una risposta soddisfacente.

La vera domanda è: Come assicurarsi che l'ambiente venga utilizzato in un'attività Rake per caricare la corretta configurazione/battitura in condizioni if ​​corrette.

Nota: Come Rake non dà molto di Rack (Rake non utilizza HTTP) per affidamento sulla RACK_ENV è fondamentalmente sbagliato, ma comune e utile se un compito Rake carica il principale Sinatra (il RACK_ENV è necessario per consentire a lo sviluppo di Sinatras?/Test?/Produzione? Impostato correttamente).

La risposta: Impostare l'ambiente con ciascuna chiamata di attività Rake.

comando linea di chiamata:

/usr/bin/rake namespace:task_name RACK_ENV=production 

cronjob chiamata (in crontab):

cd /into/your/app/root && /usr/bin/rake namespace:task_name RACK_ENV=production --silent 

Nota: Per specificare il percorso del bidone Rake non è necessario se lo avete in le tue variabili di sistema globali.Il tuo percorso potrebbe differisce dalla mia utilizzato negli esempi, controllare su sistemi Unix con: rastrello whereis

È possibile controllare il RACK_ENV nei vostri compiti tramite:

puts ENV["RACK_ENV"] 
+0

Di solito ho un compito ': environment' da cui dipendono tutte le altre attività. All'interno di ciò imposto sempre valori di default che qualsiasi altra attività avrebbe bisogno. Quindi andrei oltre e suggerirei di definire 'ENV ['RACK_ENV'] || = 'development'' nella parte superiore del Makefile o all'interno di un task': environment'. – Bill

3

Dopo 2,5 anni, voglio condividere ciò che ho trovato per essere la soluzione migliore.


Creare un file .env nella cartella principale dell'applicazione, e aggiungere una bandiera specificando l'ambiente applicativo:

ENVIRONMENT=development 

Quindi utilizzare Brandon Keepers' dotenv gemma di caricare tutte le variabili d'ambiente di questa file. Ora è possibile utilizzare qualsiasi variabile di ambiente specificata in .env all'interno delle attività Rake.

Rake si baserà sul valore esplicito impostato in .env, quindi è necessario creare .env file separati per ogni ambiente si pensa di utilizzare (per esempio dev, prova, messa in scena, produzione, ecc).

Esempio Rakefile:

require 'dotenv/tasks' 

task :default => :help 

desc 'Show this help menu' 
task :help do 
    puts "Available rake tasks:" 
    system('rake --tasks') 
end 

# Will run in any environment 
desc 'Demo task' 
task :demo_task => :dotenv do 
    puts "Running demo task in '#{ENV['ENVIRONMENT']}' mode" 
end 

# Will only run if ENVIRONMENT value in .env file is set to 'production' 
desc 'Production-only task' 
task :production_task => :dotenv do 
    if ENV['ENVIRONMENT'] == 'production' 
     puts "Running 'Production-only' task" 
    else 
     puts "Won't run, because the environment is not set to PRODUCTION!" 
    end 
end 

# Will only run if ENVIRONMENT value in .env file is set to 'development' 
desc 'Development-only task' 
task :dev_task => :dotenv do 
    if ENV['ENVIRONMENT'] == 'development' 
     puts "Running 'Development-only' task" 
    else 
     puts "Won't run, because the environment is not set to DEVELOPMENT!" 
    end 
end 

Se si desidera utilizzare le variabili d'ambiente all'interno di rack o Sinatra app (che probabilmente si fa), aggiungere il seguente alla configurazione dell'applicazione o il blocco di bootstrap:

require 'dotenv' 
Dotenv.load 
+0

Grazie! Esattamente quello che sto cercando! Giusto per chiarire, per usare diversi file '.env' per ambienti diversi, usi [avdi's approach] (http://devblog.avdi.org/2014/01/17/dotenv-for-multiple-environments/) o qualche altro meccanismo per il rake per raccogliere env vars in diversi file '.env'? – EricC

+0

Per testare le impostazioni di produzione localmente, ho un file chiamato '.env.production', che io cambio con'.env' durante l'esecuzione dei test (rinominando il file locale env in '.env.local' durante il test). –