有没有办法在Rake中获取有关当前Rack环境的信息?例如,如何判断Rack是否在development
或production
模式下运行?
据我所知,Rake不支持机架。我试图避免在生产和开发环境之间的几乎相同的Rake任务中复制代码。
答案 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.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
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