Как обнаружить среду Rails внутри, когда бы - PullRequest
20 голосов
/ 17 августа 2011

Этот вопрос, вероятно, будет иметь смысл, только если вы знаете о всякий раз, когда гем для создания cron заданий.

Для моего приложения я хочу использовать 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 ]

27 голосов
/ 08 января 2012

По крайней мере, в более новой версии, когда возможно получить доступ к среде с помощью @environment. Например, если вы хотите всякий раз генерировать записи cron только для некоторых рабочих мест:

case @environment
when 'production'
  every 1.day, :at => '0:00 am' do
    rake "some:task"
  end 
end
9 голосов
/ 17 августа 2011

Сообщение об ошибке предполагает, что Rails не определен.т. е. фреймворк не загружается, когда вы задаете вопрос, в какой среде работают рельсы.

Фактически, просмотр кода для «Всякий раз, когда он выглядит как рельсы» не является обязательным требованием (т. Е. Вы можете устанавливать и запускать всякий раз, когда рельсы даже не установлены в вашей системе).Следовательно, когда бы я ни смотрел на окружающую среду ваших рельсов, у меня нет возможности

8 голосов
/ 18 августа 2011

Как рекомендуется автором гема , решение состоит в том, чтобы передать в текущей среде переменную :

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

И Крис Бейли прав:Whenever сам не загружает среду Rails.

7 голосов
/ 01 октября 2012

Вариация первого ответа на аналогичный вопрос работал для меня. Добавить

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

на вершину schedule.rb, и вы сможете вызвать Rails.env для доступа к текущей среде Rails.

Примечание: вышеуказанный путь будет другим, если ваш файл environment.rb не находится в /app/config

1 голос
/ 08 апреля 2012

Я взял реализацию 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 в скрипте Everyever будет работать. Что было более важно в моем случае, это также работало в других скриптах, которые я включил в schedule.rb, например, тот, который загружал application.yml.

P.S. Вызов eval используется для доступа к @environment, доступному в области действия скрипта schedule.rb, внутри определения модуля.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...