Как запускать рейк-задачи с консоли?

85

Я хочу вызвать свою задачу rake с консоли. Это выполнимо? если да, то как это сделать?

Я пробовал это на консоли:

require 'rake'
Rake::Task['my_task'].invoke

но это дает мне эту ошибку:

RuntimeError: Don't know how to build task

как будто грабли не нашли задачу.

любая помощь будет оценена.

Спасибо

Изменить: я использую рельсы 2.3.5

Fajarmf
источник

Ответы:

189

Выполнение ваших задач Rake требует двух шагов:

  1. Загрузка граблей
  2. Загрузка ваших задач Rake

Вам не хватает второго шага.

Обычно это делается в Rakefile, но вы должны сделать это вручную здесь:

require 'rake'
Rails.application.load_tasks # <-- MISSING LINE
Rake::Task['my_task'].invoke
Даниэль Риковски
источник
2
Дополнительные параметры см. На stackoverflow.com/questions/577944/…
Джахан
8
Возможно, вы захотите отметить разницу между высказыванием .invokeи .execute, если вам нужно запустить задачу несколько раз (например, средство проверки работоспособности данных с приложением, запуск которого занимает слишком много времени), тогда вы захотите выполнить .executeзадачу.
mu слишком короткое
4
Если вам нужно передать аргументы, сделайте это в методе invoke:.invoke(arg1, arg2,...)
Нуно Силва
14

Самый простой способ сделать это - запустить% x [ command ] из irb. Я не уверен, чего вы хотите достичь.

%x[rake db:migrate]

РЕДАКТИРОВАТЬ: Я настоятельно рекомендую использовать, .invokeкак сказал Даниэль в принятом ответе.

Гарно
источник
1
проблема в том, что грабли, кажется, не распознают мою задачу. есть идеи почему?
Fajarmf
отлично работает @garno! извините, я знаю, что прошел год, и внезапно я столкнулся с той же потребностью.
Fajarmf
2
Вы также можете окружить его задними клещами, если хотите.
Сэм Софс,
Это медленно, потому что для этого нужно запустить новый процесс и снова создать экземпляр вашего приложения Rails. invokeлучше и эффективнее.
Джошуа Пинтер,
9

Самый простой способ:

Rails.application.load_tasks
Rake::Task['my_task'].invoke
Мохамед Зиата
источник
Это не только простой способ, но и означает, что вы не запускаете новый процесс и не создаете экземпляр своего приложения Rails снова. Легко и быстро!
Джошуа Пинтер,
2

Я использую rails 5.x.xи нуждался в такой же форме rails console.
У меня есть задача создать рейк здесь -

app/lib/task_to_execute.rake

Вот команда сработала для меня -

Загрузить Rails.application.load_tasks

Rake::Task['task_to_execute:task_name'].invoke

Сработало у меня!

С.Ядав
источник
1

Просто обратите внимание, что если вы находитесь в консоли rails, rails cвы можете просто вызвать / запустить метод задачи rake с помощьюirb(main):001:0> TaskClassName.new.my_task

Аабиро
источник