8

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

Rake が Rack-aware でないことは理解しています。本番環境と開発環境の間でほぼ同一の Rake タスクでコードを複製することを避けようとしています。

4

3 に答える 3

6

他の環境変数として、次を使用して取得できます。

ENV['RACK_ENV']

これが Sinatra アプリケーションであり、環境を に設定したことを考慮してconfig/environment.rb、以下を に追加できますRakefile

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

task :your_task => :environment do
  # task
end

次に、またはを使用して環境を取得できます ( での設定方法によって異なりますenvironment.rb) 。ENV['RACK_ENV']Sinatra::Application.environment

構成ファイルがなく、アプリケーション ファイルのみがあることを考慮するとconfig/environment.rb、たとえばhello_world.rb、次のように動作します。

hello_world.rb:

require 'sinatra'

set :environment, :production

get '/' do
  'Hello World'
end

レーキファイル:

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

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

> rake your_task
production
于 2013-03-17T10:20:07.680 に答える
3

2.5 年後、私が見つけた最良の解決策を共有したいと思います。


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

ENVIRONMENT=development

次に、Brandon Keepers のdotenvgem を使用して、このファイルからすべての環境変数を読み込みます。.envこれで、 Rake タスク内で指定された環境変数を使用できるようになりました。

Rake は で設定された明示的な値に依存するため、使用する予定の環境ごとに.env個別のファイルを作成する必要があります(例: devteststagingproductionなど)。.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

Rack または Sinatra アプリ内で環境変数を使用する場合 (おそらくそうします)、アプリケーションの config または bootstrap ブロックに次を追加します。

require 'dotenv'
Dotenv.load
于 2015-11-13T10:03:56.933 に答える