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.