如何检测里面的Rails环境

时间:2011-08-16 20:23:26

标签: ruby-on-rails ruby-on-rails-3 cron rake whenever

如果您了解用于创建 cron 作业的 whenever gem,则此问题可能才有意义。

对于我的应用,我想在所有环境中使用whenever,包括测试开发。 我的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 `<top (required)>'
    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 `<main>'

所以,我的问题基本归结为:

  1. 如何访问当前环境
  2. 在所有环境中如何使用whenever

5 个答案:

答案 0 :(得分:27)

至少在可以使用@environment访问环境的较新版本中。例如,如果您希望只为生产中的某些作业生成cron条目:

case @environment
when 'production'
  every 1.day, :at => '0:00 am' do
    rake "some:task"
  end 
end

答案 1 :(得分:9)

错误消息表明未定义Rails。当你提出问题是什么环境是rails运行时,框架没有被加载。

事实上,从查看代码时,看起来不需要rails(即,即使安装在系统上,也可以安装并运行Whenever without rails)。因此,无论什么时候都无法看到你的铁轨环境(据我所知)

答案 2 :(得分:8)

作为recommended by the gem author,解决方案是pass in the current environment as a variable

$ whenever --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'

$ whenever --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环境。

答案 3 :(得分:7)

a similar question的第一个答案的变体对我有用。添加

require File.expand_path(File.dirname(__FILE__) + "/../config/environment")

schedule.rb的顶部,您将能够调用Rails.env来访问当前的Rails环境。

注意:如果您的environment.rb文件不在/app/config

,则上述路径会有所不同

答案 4 :(得分:1)

我执行了Rails.env我发现了here(通过点击“来源”),然后用它来::Rails初始化config/schedule.rb模块}

eval %Q(module ::Rails
  def self.env
    '#{@environment}' || ENV["RAILS_ENV"] || ENV["RACK_ENV"] || "development"
  end
end
)

这将创建Rails模块,并使其环境返回--set environment=...命令行中whenever提供的内容,如脚本作者所建议的那样。

但是,默认情况下将@environment设置为生产,因此这个大“或”可能不太有用。

现在,Whenever脚本中的Rails.env调用将起作用。在我的情况下更重要的是,它也适用于schedule.rb中包含的其他脚本,例如加载application.yml的脚本。

P.S。 eval调用用于从模块定义中访问@environment脚本范围内的schedule.rb