Подтвердить что ты не робот

Как определить среду Rails внутри

Этот вопрос, вероятно, будет иметь смысл, если вы знаете о whenever gem для создания 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/[email protected]/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `eval': uninitialized constant Whenever::JobList::Rails (NameError)
    from /home/marius/.rvm/gems/[email protected]/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `eval'
    from /home/marius/.rvm/gems/[email protected]/gems/whenever-0.6.8/lib/whenever/job_list.rb:21:in `initialize'
    from /home/marius/.rvm/gems/[email protected]/gems/whenever-0.6.8/lib/whenever.rb:15:in `new'
    from /home/marius/.rvm/gems/[email protected]/gems/whenever-0.6.8/lib/whenever.rb:15:in `cron'
    from /home/marius/.rvm/gems/[email protected]/gems/whenever-0.6.8/lib/whenever/command_line.rb:41:in `run'
    from /home/marius/.rvm/gems/[email protected]/gems/whenever-0.6.8/lib/whenever/command_line.rb:8:in `execute'
    from /home/marius/.rvm/gems/[email protected]/gems/whenever-0.6.8/bin/whenever:38:in `<top (required)>'
    from /home/marius/.rvm/gems/[email protected]/bin/whenever:19:in `load'
    from /home/marius/.rvm/gems/[email protected]/bin/whenever:19:in `<main>'

Итак, мой вопрос в основном сводится к следующему:

  • Как получить доступ к текущей среде или
  • Что мне делать, чтобы использовать whenever во всех средах?
4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Как рекомендованный автором gem, решение проходит в текущей среде как переменная

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

Ответ 4

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

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

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

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

Ответ 5

Я взял реализацию 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, как предполагает автор script.

Однако , когда для @environment устанавливается по умолчанию, поэтому этот большой "или" может быть не совсем полезен.

Теперь вызов Rails.env в том случае, когда script будет работать. Что было более важно в моем случае, оно также работало и в других сценариях, включенных в schedule.rb, таких как загружаемый application.yml.

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