如何在Rake中获得当前的Rack环境?

时间:2013-03-17 10:08:29

标签: ruby rake rack

有没有办法在Rake中获取有关当前Rack环境的信息?例如,如何判断Rack是否在developmentproduction模式下运行?

据我所知,Rake不支持机架。我试图避免在生产和开发环境之间的几乎相同的Rake任务中复制代码。

3 个答案:

答案 0 :(得分:6)

问题已经过去了,但从未获得最佳实践答案或满意的答案。

真正的问题是:如何确保在Rake任务中使用哪个环境,以便加载正确的配置/点击正确的if条件。

  

注意:由于Rake没有提供很多关于Rack(Rake不使用HTTP)的信息   依赖于RACK_ENV基本上是错误的但是如果是Rake则常见且方便   任务加载你的主要Sinatra应用程序(RACK_ENV需要让   西纳特拉斯的发展? /测试? / 生产?正确设置。)

答案:通过每次Rake任务调用设置环境。

命令行调用:

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

Cronjob调用(在crontab中):

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

注意:如果在全局系统变量中包含Rake bin,则无需指定Rake bin的路径。您的路径可能与示例中使用的路径不同,请在Unix系统上查看:whereis rake

您可以通过以下方式检查任务中的RACK_ENV

puts ENV["RACK_ENV"]

答案 1 :(得分:5)

作为其他环境变量,您可以使用以下方法检索它:

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.rbENV['RACK_ENV']检索环境(具体取决于您在Sinatra::Application.environment中的设置方式)。

考虑到没有config/environment.rb配置文件,只有应用程序文件,例如hello_world.rb,以下工作:

hello_world.rb:

require 'sinatra'

set :environment, :production

get '/' do
  'Hello World'
end

Rake文件:

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

答案 2 :(得分:3)

2。5年后,我想分享我发现的最佳解决方案。

在应用程序的根文件夹中创建一个dependencies { compile files('libs/App42MultiPlayerGamingSDK.jar') } 文件,并添加一个指定应用程序环境的标志:

.env

然后使用Brandon Keepers' dotenv gem从此文件加载所有环境变量。现在,您可以在Rake任务中使用ENVIRONMENT=development 中指定的任何环境变量。

Rake将依赖于.env中设置的显式值,因此您必须为计划使用的每个环境创建单独的.env文件(例如 dev 测试登台制作等。)

示例.env

Rakefile

如果您想在Rack或Sinatra应用程序中使用环境变量(您可能会这样做),请将以下内容添加到应用程序的配置或引导程序块中:

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