У меня есть задача Rails: следует ли использовать script/runner или rake?
Для специальных задач Rails у нас есть несколько альтернатив реализации, среди которых, пожалуй, будет:
script/runner some_useful_thing
и
rake some:other_useful_thing
Какой вариант я должен предпочесть? Если есть явный фаворит, когда, если вообще когда-либо, я должен использовать другой? Если никогда, то почему вы предположили бы, что он все еще присутствует в рамках без предупреждений об отказе?
Ответы
Ответ 1
Разница между ними заключается в том, что script/runner
загружает Rails, тогда как задача Rake не делает этого, если вы не сообщите об этом, заставив задачу зависеть от :environment
, например:
task :some_useful_task => :environment do
# do some useful task
end
Поскольку загрузка Rails стоит дорого, возможно, стоит пропустить, если вы можете избежать этого.
Кроме этого, они примерно эквивалентны. Я использую оба варианта, но в последнее время я использовал script/runner
выполнение script отдельно.
Ответ 2
FWIW кажется, что есть перемещение от использования script бегун в пользу rake:
Обновление (4/25/2009): Я рекомендую использовать задачи рейка, а не script/runner для повторяющихся задач.
Кроме того, как за этот пост, вы можете использовать грабли для повторяющихся задач просто:
Если бы я тогда хотел, чтобы это выполнялось ночью в моей производственной базе данных в полночь, я мог бы написать cronjob, который выглядит примерно так:
0 0 * * * cd/var/www/apps/rails_app/& && & &/usr/local/bin/rake RAILS_ENV = производственные утилиты: send_expire_soon_emails
Ответ 3
Исправлено на основании комментария 2. Дайте им карму!
FWIW - Rails 3.0+ изменяет способ инициализации системы Rails в автономном script.
require File.dirname(__FILE__) + '/config/environment'
Как уже упоминалось выше, вы также можете:
rails runner script/<script name>
Или поместите весь код в задачу Rake, но у меня есть много устаревшего кода из Rails 2; поэтому я не хотел сразу идти по этому пути.
У каждого есть свои преимущества и недостатки.
Ответ 4
Передача параметров в рейк-задачу - это боль в прикладе, если не сказать больше. Вам нужно либо прибегнуть к переменным окружения, либо к очень хакерской системе параметров, которая не является интуитивной и имеет множество предостережений.
Если ваша задача должна обрабатывать аргументы командной строки изящно, то писать script - это путь.
Luke Francl упоминает, что script/бегун загружает Rails. Это правда. Но если вы не хотите загружать рельсы, просто запустите script, как и без script/runner. Таким образом, единственная реальная разница между сценариями и рейк-задачами - их эстетика. Выберите все, что вам нравится.
Я использую задачи грабли для небольших задач (одна или две строки). Все более сложное попадает в каталог script/. Я нарушу это правило, если буду думать, что другие разработчики ожидают, что код будет жить в одном месте над другим.
Ответ 5
Одна вещь, которую я сделал, это просто написать обычные рубиновые скрипты и поместить их в каталог script/maintenance
.
Все, что вам нужно сделать, чтобы загрузить рельсы и получить доступ ко всем вашим моделям и т.д., помещается require '../../config/environment.rb'
в начало вашего файла, а затем вы отсутствуете.
Ответ 6
В Rails 3.0+ для config/environment.rb
требуется config/application.rb
, для которого требуется config/boot.rb
.
Итак, чтобы загрузить приложение в Rails 3, вам все равно потребуется только environment.rb
Ответ 7
Для одних команд script/runner может быть в порядке. Что-то повторяющееся, в долгосрочной перспективе задача грабли проще, и есть сводка, если вы забудете, что она делает.
Ответ 8
У меня сложилось впечатление, что script/runner был в основном для периодических задач. Например, задание cron, которое выполняется:
SomeClass.update_from_web('http://www.sourcefordata.gov/')