21

如果您了解用于创建cron作业的when 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在所有环境中使用?
4

5 回答 5

29

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

case @environment
when 'production'
  every 1.day, :at => '0:00 am' do
    rake "some:task"
  end 
end
于 2012-01-08T17:02:01.117 回答
9

错误消息表明未定义 Rails。即当您询问rails 运行的环境是什么时,没有加载框架。

事实上,通过查看代码,它看起来像 rails 并不是它的要求(即,您可以在没有安装 rails 的情况下安装和运行任何时候,甚至在系统上安装)。因此,无论何时都无法查看您的 Rails 环境(据我所知)

于 2011-08-16T20:37:12.587 回答
9

根据gem 作者的建议,解决方案是将当前环境作为变量传递

$ 每当 --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:活动:同步 --silent >> /home/marius/uxolo/log/cron.log 2>> /home/marius/uxolo/log/error.log'

$ 每当 --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:活动:同步 --silent >> /home/marius/uxolo/log/cron.log 2>> /home/marius/uxolo/log/error.log'

Chris Bailey 是对的:Whenever它本身不加载 Rails 环境。

于 2011-08-18T14:33:16.090 回答
8

对类似问题的第一个答案的变体对我有用。添加

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

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

environment.rb注意:如果您的文件不在,上述路径会有所不同/app/config

于 2012-10-01T13:51:20.413 回答
1

我采用了Rails.env我在此处找到的实现(通过单击“源”),并用它来初始化::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默认设置为生产,所以这个大的“或”可能不是很有用。

现在,Rails.env无论何时脚本中的调用都可以工作了。对我来说更重要的是,它也适用于我包含的其他脚本schedule.rb,例如加载的脚本application.yml

PS 该eval调用用于从模块定义内部访问脚本@environment范围内可用的。schedule.rb

于 2012-04-08T19:35:06.643 回答