如何检测里面的Rails环境
如果您了解创建cron作业的gem,那么这个问题可能才有意义。
对于我的应用程序,我想在所有环境中使用,包括测试和开发 。
我的schedule.rb
看起来像这样:
set :output, { :error => "#{path}/log/error.log", :standard => "#{path}/log/cron.log" } set :environment, Rails.env.to_sym every 5.minutes do rake 'db:activity:synchronize' end
但它在Rails.env.to_sym
失败了( 同样代表 RAILS_ENV
):
/home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `eval': uninitialized constant Whenever::JobList::Rails (NameError) from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `eval' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `initialize' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever.rb:15:in `new' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever.rb:15:in `cron' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/command_line.rb:41:in `run' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/lib/whenever/command_line.rb:8:in `execute' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/gems/whenever-0.6.8/bin/whenever:38:in `' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/bin/whenever:19:in `load' from /home/marius/.rvm/gems/ruby-1.9.2-p290@uxolo/bin/whenever:19:in `'
所以,我的问题基本归结为:
- 如何访问当前环境, 或
- 在所有环境中,我应该怎么做才能使用?
错误消息表明未定义Rails。 即当你提出问题是什么环境是rails运行时,框架没有被加载。
实际上从查看代码时,看起来它不是一个要求它(即你可以安装和运行Whenever,甚至没有rails甚至安装在你的系统上)。 因此,无论什么时候都无法看到你的铁轨环境(据我所知)
至少在较新版本中,只要有可能使用@environment
访问环境。 例如,如果您希望只为生产中的某些作业生成cron条目:
case @environment when 'production' every 1.day, :at => '0:00 am' do rake "some:task" end end
根据gem作者的建议 ,解决方案是将当前环境作为变量传递 :
$ when --set environment = test 0,5,10,15,20,25,30,35,40,45,50,55 * * * * / bin / bash -l -c'cd / home / marius / uxolo && RAILS_ENV = test rake db: activity:synchronize --silent >> /home/marius/uxolo/log/cron.log 2 >> /home/marius/uxolo/log/error.log' $ when --set environment = development 0,5,10,15,20,25,30,35,40,45,50,55 * * * * / bin / bash -l -c'cd / home / marius / uxolo && RAILS_ENV = development rake db: activity:synchronize --silent >> /home/marius/uxolo/log/cron.log 2 >> /home/marius/uxolo/log/error.log'
而Chris Bailey是对的: Whenever
它自己不加载Rails环境时。
对类似问题的第一个答案的变体对我有用。 加
require File.expand_path(File.dirname(__FILE__) + "/../config/environment")
在schedule.rb
的顶部,您将能够调用Rails.env来访问当前的Rails环境。
注意:如果您的environment.rb
文件不在/app/config
则上述路径会有所不同
我在这里找到了Rails.env
的实现(点击“source”),并用它在config/schedule.rb
的开头初始化::Rails
模块
eval %Q(module ::Rails def self.env '#{@environment}' || ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development" end end )
这将创建Rails
模块,并使其环境返回您在--set environment=...
命令行中提供的--set environment=...
,如脚本作者所建议的那样。
但是, 每当默认情况下将@environment
设置为@environment
,所以这个大的“或”可能不太有用。
现在,Whenever脚本中的Rails.env
调用将起作用。 在我的情况下更重要的是,它也适用于我包含在schedule.rb
中的其他脚本,例如加载application.yml
脚本。
PS eval
调用用于从模块定义内部访问schedule.rb
脚本范围内的@environment
。