有没有办法在Rake中获得关于当前Rack环境的信息?例如,我如何判断Rack是在development模式还是production模式下运行?
我知道Rake不是机架感知的。我正在努力避免在生产环境和开发环境之间复制几乎相同的Rake任务中的代码。
发布于 2014-09-23 19:48:28
问题很老,但从来没有得到过最佳实践的答案或令人满意的答案。
真正的问题是:如何确定在Rake任务中使用了哪个环境,以便加载正确的配置/命中正确的if条件。
注意:由于瑞克并没有给出太多关于瑞克的信息(瑞克没有使用超文本传输协议),依赖RACK_ENV基本上是错误的,但如果瑞克的任务加载了你的主要Sinatra应用程序( RACK_ENV是让Sinatras开发所必需的吗?/测试?/生产?设置正确)。
答案是:为每个Rake任务调用设置环境。
命令行调用:
/usr/bin/rake namespace:task_name RACK_ENV=productionCronjob调用(在crontab中):
cd /into/your/app/root && /usr/bin/rake namespace:task_name RACK_ENV=production --silent注意:如果您的全局系统变量中有Rake bin的路径,则不需要指定它。您的路径可能与示例中使用的路径不同,请使用以下命令检查Unix系统: whereis rake
您可以通过以下方式检查任务中的RACK_ENV:
puts ENV["RACK_ENV"]发布于 2013-03-17 18:20:08
与其他环境变量一样,您可以使用以下命令检索它:
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然后,您可以使用ENV['RACK_ENV']或Sinatra::Application.environment检索环境(取决于您在environment.rb中的设置方式)。
考虑到没有config/environment.rb配置文件,只有应用程序文件,例如hello_world.rb,可以使用以下方法:
hello_world.rb:
require 'sinatra'
set :environment, :production
get '/' do
'Hello World'
endRakefile:
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发布于 2015-11-13 18:03:57
两年半后,我想分享我发现的最好的解决方案。
在应用程序的根文件夹中创建.env文件,并添加指定应用程序环境的标志:
ENVIRONMENT=development然后使用Brandon Keepers的 gem加载该文件中的所有环境变量。现在,您可以在Rake任务中使用在.env中指定的任何环境变量。
Rake将依赖于在.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如果您想在Rack或Sinatra应用程序中使用环境变量(您可能会这样做),请将以下内容添加到应用程序的配置或引导程序块中:
require 'dotenv'
Dotenv.loadhttps://stackoverflow.com/questions/15459569
复制相似问题