2013-03-17 9 views
6

Gibt es eine Möglichkeit, Informationen über die aktuelle Rack-Umgebung in Rake zu erhalten? Wie kann ich beispielsweise feststellen, ob Rack in development oder production ausgeführt wird?Wie bekomme ich die aktuelle Rack-Umgebung in Rake?

Ich verstehe, dass Rake nicht Rack-bewusst ist. Ich versuche zu vermeiden, Code in fast identischen Rake-Aufgaben zwischen Produktions- und Entwicklungsumgebungen zu replizieren.

+0

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

+1

@ted, dieser Link bezieht sich auf die Verwendung der Rack-Umgebung in Rails und erwähnt nichts über Rake. Wie gilt es? –

+0

Bitte zeigen Sie diese verschiedenen Rake-Aufgaben an. Vielleicht können wir helfen, wenn wir Code sehen. – robkuz

Antwort

5

Als andere Umgebungsvariable, können Sie es mit Hilfe abrufen:

ENV['RACK_ENV'] 

es ist ein Sinatra-Anwendung betrachtet, und dass Sie die Umgebung in config/environment.rb gesetzt haben, können Sie Folgendes zu Ihrer hinzufügen Rakefile:

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

task :your_task => :environment do 
    # task 
end 

Dann können Sie die Umgebung abrufen (je nachdem, wie Sie es in Ihrem environment.rb einrichten) mit ENV['RACK_ENV'] oder Sinatra::Application.environment.

In Anbetracht es ist keine config/environment.rb Config-Datei, nur die Anwendungsdatei, zum Beispiel hello_world.rb, die folgenden Werke:

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 

Wenn Sie rake your_task tun, sollten Sie erhalten:

> rake your_task 
production 
+0

Funktioniert nicht. Hier ist ein einfaches Rakefile zur Veranschaulichung: 'task: test_rack_env do puts ENV ['RACK_ENV'] Ende' Druckt eine leere Zeile. –

+0

Wo legen Sie die Rack-Umgebung auf "Produktion" oder "Entwicklung" fest? – toch

+0

Ich benutze Sinatra, also setzt es die Umgebung. –

6

Frage ist alt, aber nie die Best-Practice-Antwort oder eine befriedigende Antwort überhaupt abgerufen.

Die eigentliche Frage ist: Wie sicher gehen, welche Umgebung in einer Rake-Aufgabe verwendet wird, um die richtige Konfiguration zu laden/in richtige If-Bedingungen zu treffen.

Hinweis: Da Rake nicht viel geben über Rack (Rake wird nicht über HTTP) zu auf der RACK_ENV verlassen können, ist grundsätzlich falsch, aber häufig und praktisch, wenn ein Rake Aufgabe Ihre Haupt Sinatra Anwendung lädt (die RACK_ENV muss Sinatras Entwicklung?/Test?/Produktion? Korrekt eingestellt sein).

Die Antwort: Legen Sie die Umgebung mit jedem Rake-Task-Aufruf fest.

Kommandozeilenaufruf:

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

Cronjob Aufruf (in crontab):

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

Hinweis: ist, wenn Sie es nicht erforderlich, um den Pfad des Rake ist angeben müssen Ihre globalen Systemvariablen.Ihr Weg von der Mine in den Beispielen verwendet, überprüfen Sie auf Unix-Systemen mit unterscheidet könnten: whereis Rake

Sie können die RACK_ENV in Ihre Aufgaben über prüfen:

puts ENV["RACK_ENV"] 
+0

Normalerweise habe ich eine Aufgabe ': environment', von der alle anderen Aufgaben abhängen. Innerhalb dieser stelle ich immer Standardwerte ein, die jede andere Aufgabe benötigen würde. Ich würde also weiter gehen und vorschlagen, 'ENV ['RACK_ENV'] || = 'Entwicklung' entweder am Anfang des Makefiles oder innerhalb einer': environment' Aufgabe zu definieren. – Bill

3

Nach 2,5 Jahren möchte ich teile, was ich für die beste Lösung gefunden habe.


erstellen .env-Datei im Stammverzeichnis der Anwendung, und fügen Sie eine Flagge, um die Anwendungsumgebung spezifiziert:

ENVIRONMENT=development 

Dann dotenv gem Brandon Keeper verwenden, um alle Umgebungsvariablen aus dieser laden Datei. Jetzt können Sie alle in .env angegebenen Umgebungsvariablen in Rake-Tasks verwenden.

Rake wird auf dem expliziten Wert in .env gesetzt verlassen, so müssen Sie für jede Umgebung, die Sie planen getrennte .env Dateien erstellen, die auf (z.B. dev, Test, Inszenierung, Produktion, etc).

Probe 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 

Wenn Sie die Umgebungsvariablen in Ihrem Rack oder in Sinatra app (die Sie wahrscheinlich tun) verwenden möchten, fügen Sie den folgenden auf die Config-Anwendung oder Bootstrap-Block:

require 'dotenv' 
Dotenv.load 
+0

Danke! Genau das, wonach ich suche! Um nur zu verdeutlichen, um verschiedene '.env' Dateien für verschiedene Umgebungen zu verwenden, verwenden Sie [avdis Ansatz] (http://devblog.avdi.org/2014/01/17/dotenv-for-multiple-environments/) oder ein anderer Mechanismus für Rake, um env vars in verschiedenen '.env'-Dateien aufzunehmen? – EricC

+0

Um die Produktionseinstellungen lokal zu testen, habe ich eine Datei namens '.env.production', die ich mit'.env' beim Ausführen von Tests (Umbenennen der lokalen env-Datei in '.env.local' während des Tests). –