2013-03-17 6 views
6

Rakeの現在のRack環境に関する情報を入手する方法はありますか?たとえば、ラックがdevelopmentまたはproductionモードで動作しているかどうかを確認するにはどうすればよいですか?Rakeで現在のRack環境を取得するには?

私はRakeがRack対応ではないことを理解します。実動環境と開発環境の間でほぼ同じRakeタスクでコードを複製しないようにしようとしています。他の環境変数として

+0

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

+1

このリンクは、Rails内のラック環境の使用に関するものであり、レーキについては何も言及していません。それはどのように適用されますか? –

+0

これらの異なるRakeタスクを表示してください。もし私たちがいくつかのコードを見たら助けてくれるかもしれません。 – robkuz

答えて

5

、あなたが使用してそれを取得することができます。

ENV['RACK_ENV'] 

を、それはシナトラのアプリケーションだし、あなたがconfig/environment.rbに環境を設定したことを考えると、あなたはに以下を追加することができ、あなたのRakefile

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

task :your_task => :environment do 
    # task 
end 

その後、あなたはENV['RACK_ENV']またはSinatra::Application.environmentと環境(あなたがenvironment.rbでそれを設定する方法によって)を取得することができます。

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 
例えば hello_world.rb、用 config/environment.rb設定ファイル、唯一のアプリケーションファイルは、以下の作品はありません考慮

rake your_taskを実行するときは、次を取得する必要があります。

> rake your_task 
production 
+0

動作しません。ここに簡単なRakefileを示します: 'task:test_rack_env do puts ENV ['RACK_ENV'] end' 空白行を出力します。 –

+0

ここで、Rack環境を 'production'または' development'に設定していますか? – toch

+0

私はSinatraを使用しているので、環境を設定します。 –

6

質問は古いですが、ベストプラクティスの回答または満足する回答を一切取ったことはありません。

実際の質問はどのような環境でRakeタスクで正しい設定やヒットを正しいif条件にロードするかを確認する方法。

注:レーキは、ラックについて多くを与えるものではありませんので(レーキは、HTTPを使用していない) へRACK_ENVに依存しているレーキ タスクは、あなたのメインのシナトラのアプリケーションをロードする場合は基本的に間違っているが、一般的で便利です( RACK_ENVは、Sinatrasの開発/ test/productionが正しく設定されていることを確認するために必要です。

答え:各Rakeタスクコールで環境を設定します。

コマンドライン呼び出し:(crontabの中)

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

cronジョブ呼び出し:

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

注:あなたはそれを持っている場合はレーキビンのパスを指定する必要はありませんグローバルシステム変数。あなたのパスは、例で使用される鉱山と異なってUnixシステム上で確認することがありますwhereisは熊手

あなたが経由であなたのタスクでRACK_ENVを確認することができます。私がしたい、2.5年後

puts ENV["RACK_ENV"] 
+0

私は通常、他のすべてのタスクが依存する ':environment'タスクを持っています。その中で私はいつも他のタスクが必要とするデフォルト値を設定します。ですから、さらに進んで、 'ENV ['RACK_ENV'] || = 'development''をMakefileのトップか':environment'タスクの中で定義することを提案します。 – Bill

3

私が見つけたものを最高の解決策にしてください。


アプリケーションのルートフォルダに.envファイルを作成し、アプリケーション環境を指定するフラグを追加します。

ENVIRONMENT=development 

次に、このからすべての環境変数をロードするためにブランドンキーパーdotenv宝石を使用ファイル。これで、Rakeタスク内で.envに指定されている環境変数を使用できます。あなたが(例えばDEVテストステージング、生産など)を使用する予定の各環境個別の.envファイルを作成する必要がありますので、

レーキは、.envに設定された明示的な値に依存しています。

サンプル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 

あなたは(おそらくん)あなたのラックやシナトラアプリ内の環境変数を使用したい場合は、アプリケーションの設定やブートストラップブロックに次の行を追加します。

+0

ありがとう!まさに私が探しているもの!さまざまな環境で異なる '.env'ファイルを使用するには、[avdiのアプローチ](http://devblog.avdi.org/2014/01/17/dotenv-for-multiple-environments/)またはrakeが異なる '.env'ファイルでenv変数を拾うためのいくつかの他のメカニズム? – EricC

+0

ローカルでプロダクション設定をテストするには、 '.env.production'というファイルがあります。テストを実行している間は 'env'を実行します(テスト中にローカルenvファイルの名前を' .env.local'に変更します)。 –

関連する問題