Как определить среду 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
во всех средах?
Ответы
Ответ 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, изнутри определения модуля.