Як запустити рейкові завдання з консолі?


84

Я хочу викликати своє завдання з консолі. Це можливо? якщо так, то як це зробити?

Я спробував це на консолі:

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

але це видає мені цю помилку:

RuntimeError: Don't know how to build task

це як граблі не можуть знайти завдання.

будь-яка допомога буде вдячна.

Дякую

Редагувати: я використовую рейки 2.3.5

Відповіді:


188

Запуск ваших завдань Rake вимагає двох кроків:

  1. Завантаження граблів
  2. Завантаження ваших завдань Rake

Вам не вистачає другого кроку.

Зазвичай це робиться у Rakefile, але тут потрібно робити це вручну:

require 'rake'
Rails.application.load_tasks # <-- MISSING LINE
Rake::Task['my_task'].invoke

2
Для отримання додаткових можливостей зверніться до stackoverflow.com/questions/577944/…
Джахан

7
Можливо, ви захочете помітити різницю між вимовою .invokeта .execute, якщо вам потрібно запустити завдання кілька разів (наприклад, перевірку обґрунтованості даних із додатком, який запускається занадто довго), тоді ви захочете виконати .executeзавдання.
му занадто коротке ,

3
Якщо вам потрібно передати аргументи, зробіть це методом виклику:.invoke(arg1, arg2,...)
Нуно Сільва

14

Найпростіший спосіб це запустити% x [ команда ] з irb. Я не впевнений, що саме ви хочете досягти.

%x[rake db:migrate]

EDIT: Я настійно рекомендую використовувати, .invokeяк говорить Даніель у прийнятій відповіді.


1
проблема в тому, що Рейк, схоже, не визнає мого завдання. будь-яка ідея чому?
Фаджармф

це чудово працює @garno! вибачте, я знаю, що минув рік, і раптом я стикаюся з тією ж потребою.
Фаджармф

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.