Wie führe ich Rake-Aufgaben von der Konsole aus?


84

Ich möchte meine Rechenaufgabe über die Konsole aufrufen. Ist es machbar? Wenn ja, wie geht das?

Ich habe das auf der Konsole versucht:

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

aber es gibt mir diesen Fehler:

RuntimeError: Don't know how to build task

Es ist, als ob der Rechen die Aufgabe nicht finden kann.

Jede Hilfe wäre dankbar.

Vielen Dank

Bearbeiten: Ich benutze Schienen 2.3.5

Antworten:


188

Das Ausführen Ihrer Rake-Aufgaben erfordert zwei Schritte:

  1. Rechen laden
  2. Laden Sie Ihre Rake-Aufgaben

Ihnen fehlt der zweite Schritt.

Normalerweise geschieht dies im Rakefile, aber Sie müssen es hier manuell tun:

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

2
Weitere Optionen finden Sie unter stackoverflow.com/questions/577944/…
Jahan

7
Möglicherweise möchten Sie den Unterschied zwischen "Sagen" .invokeund " .executeWenn Sie die Aufgabe mehrmals ausführen müssen (z. B. eine Überprüfung der Datensicherheit mit einer App, deren Start zu lange dauert)" beachten, möchten Sie die Aufgabe ausführen .execute.
Mu ist zu kurz

3
Wenn Sie Argumente übergeben müssen, tun Sie dies in der Aufrufmethode:.invoke(arg1, arg2,...)
Nuno Silva

14

Der einfachste Weg, dies zu tun, besteht darin,% x [ Befehl ] vom irb aus auszuführen. Ich bin mir nicht sicher, ob Sie das erreichen wollen.

%x[rake db:migrate]

EDIT: Ich empfehle dringend, .invokewie Daniel in der akzeptierten Antwort sagt.


1
Das Problem ist, Rake scheint meine Aufgabe nicht zu erkennen. Irgendeine Idee warum?
Fajarmf

es funktioniert perfekt @garno! Es tut mir leid, dass ich weiß, dass es ein Jahr her ist und plötzlich habe ich das gleiche Bedürfnis.
Fajarmf

2
Sie können es auch in Back Ticks umgeben, wenn Sie möchten.
Sam Soffes

Dies ist langsam, da ein neuer Prozess gestartet und Ihre Rails-App erneut instanziiert werden muss. invokeist besser und effizienter.
Joshua Pinter

9

Der einfache Weg ist:

Rails.application.load_tasks
Rake::Task['my_task'].invoke

Dies ist nicht nur der einfache Weg, sondern bedeutet auch, dass Sie keinen neuen Prozess starten und Ihre Rails-App erneut instanziieren. Einfach und schnell!
Joshua Pinter

2

Ich benutze rails 5.x.xund war in der Notwendigkeit, die gleiche Form zu tun rails console.
Ich habe hier eine Rechenaufgabe erstellt.

app/lib/task_to_execute.rake

Hier ist der Befehl für mich gearbeitet-

Belastung Rails.application.load_tasks

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

Hat für mich gearbeitet!


1

Nur ein Hinweis, dass Sie, wenn Sie sich in der Rails-Konsole rails cbefinden, die Rake-Task-Methode einfach über aufrufen / ausführen könnenirb(main):001:0> TaskClassName.new.my_task

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.