21

この質問は、 cronジョブを作成するためのwhengemについて知っている場合にのみ意味があります。

私のアプリでは、テスト開発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が実行されている環境について質問するときに、フレームワークがロードされません。

実際、いつでもレールが必要ではないように見えるときのコードを見ると(つまり、システムにレールがインストールされていなくても、いつでもインストールして実行できます)。したがって、いつでもあなたのレール環境を見る方法はありません(私が知る限り)

于 2011-08-16T20:37:12.587 に答える
9

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=開発レーキ データベース: activity:synchronize --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")

Rails.envschedule.rbを呼び出して、現在の Rails 環境にアクセスできるようになります。

注:environment.rbファイルが存在しない場合、上記のパスは異なります/app/config

于 2012-10-01T13:51:20.413 に答える
1

私はここRails.envで見つけた実装を(「ソース」をクリックして)取得し、それを使用してモジュールの最初にモジュールを初期化しました。::Railsconfig/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で、Wheneverスクリプトの呼び出しが機能します。私の場合、もっと重要だったのは、schedule.rbをロードしたスクリプトなど、私が組み込んだ他のスクリプトでも機能したことapplication.ymlです。

PSこのeval呼び出しは、モジュールの定義内からスクリプト@environmentのスコープで使用可能なものにアクセスするために使用されます。schedule.rb

于 2012-04-08T19:35:06.643 に答える