Wo sind Rechenaufgaben definiert?

69

Auf einem frisch erstellten Rails-Projekt (generiert von rails someName ) können einige 'Standard'-Rake-Aufgaben ausgeführt werden wie:

  • rake test
  • rake db:migrate
  • usw

Die Frage ist, wo werden diese Aufgaben beschrieben? Die Standardeinstellung Rakefileenthält nicht alle diese Aufgaben.

Außerdem habe ich ein Projekt überprüft, das verwendet, rspecund ich kann rake specalle Tests ausführen. Wo kommt diespec definiert Ziel?

Ryanprayogo
quelle
Beantwortet das deine Frage? Wie finde ich die Quelldatei für eine Rechenaufgabe?
Entkorken

Antworten:

50

Rechenaufgaben werden automatisch aus der Ordnerstruktur geladen lib/tasks/*.rake

Wenn wir zum Beispiel über die Aufgabe db: migrate sprechen, befindet sie sich innerhalb des Rails-Edelsteins in lib/tasks/databases.rake

Für ein bestimmtes Projekt haben Sie also immer die Aufgaben in der Projektordnerstruktur sowie alle Aufgaben in den angegebenen Edelsteinen.

DanneManne
quelle
4
Zumindest in Rails 4 werden die Datenbankaufgaben im ActiveRecord-Gem gespeichert. Um den Pfad zu sehen, von dem Rake eine Aufgabe lädt, verwenden Sierake -W task:name
Qqwy
112

Wenn mit beschrieben Sie definiert meinen, ist Rechen -W Ihr Freund. Beispiel:

$ rake -W db:create

=>

rake db:create  /path/to/ruby/gems/1.9.1/gems/activerecord-3.1.11/lib/active_record/railties/databases.rake:39:in `block in <top (required)>'

Habe das heute herausgefunden :)

Adam Groves
quelle
20

Gehen Sie folgendermaßen vor, um die spezifischen Dateien und Zeilennummern zu finden, in denen eine Aufgabe definiert und / oder geändert wird:

Starten Sie eine Rails-Konsole:

rails c

Führen Sie dann die folgenden Befehle aus:

require 'rake'
Rake::TaskManager.record_task_metadata=true
Rake.application.load_rakefile
tsk = Rake.application.tasks.find {|t| t.name =='my_task_name'}
tsk.locations

Rake kann die Standorte grundsätzlich intern verfolgen und verfügt über eine raffinierte Methode, um sie auf Anfrage anzuzeigen. Der obige Code lädt im Grunde Rake, weist Rake an, die Dateispeicherorte zu verfolgen, lädt die Rake-Datei (und alle anderen enthaltenen), findet die betreffende Aufgabe und ruft die Speicherortmethode darauf auf.

Aus dem Kommentar von sameers geht hervor, dass Sie für Rake v 10.1.0 und möglicherweise ältere Versionen von Rake möglicherweise Folgendes aufrufen müssen: tsk.actions anstelle von tsk.locations

jpgeek
quelle
Das ist ein toller Tipp! Ich arbeite an einer Anwendung mit Aufgaben, die in mehreren verschiedenen Bibliotheken definiert sind, und es kann sehr schwierig sein, ohne einen solchen Trick herauszufinden, welche Aufgabe von wo kommt.
Steve Jorgensen
Das könnte Code sein, der für eine ältere Version von Rake funktioniert ... Ich habe 10.1.0, in dem Sie die letzte Zeile intsk.actions
sameers
@sameers - Danke für den Kommentar. Ich habe es gerade mit Rake-10.1.1 versucht und es funktioniert mit Standorten.
Jpgeek
2
Kleiner Hinweis: Das sollten Sie nicht brauchen. Rake.application.tasks.find. Möglicherweise müssen Sie auch eine Last senden, wenn diese für Sie privat ist. Rake.application.send(:load, 'Rakefile')oder du könntest es einfach benutzen Rake.application.load_rakefile.
con--
2
@ con-- Danke dafür. Entsprechend aktualisiert.
Jpgeek
5

Sie haben nicht angegeben, welche Schienenversion Sie verwenden, aber in 3.0.7 dbbefinden sich die Aufgaben im ActiveRecord-Gem in

lib/active_record/railties/databases.rake

Aktualisieren:

Ab Rails Version 3.2.7 sind die Aufgaben immer noch dort, wo ich oben angegeben habe.

mraaroncruz
quelle
2

In Rails 3 railtiesdefiniert der Edelstein viele Rechenaufgaben.

railties-3.2.5/lib/rails/tasks/annotations.rake
railties-3.2.5/lib/rails/tasks/documentation.rake
railties-3.2.5/lib/rails/tasks/engine.rake
railties-3.2.5/lib/rails/tasks/framework.rake
railties-3.2.5/lib/rails/tasks/log.rake
railties-3.2.5/lib/rails/tasks/middleware.rake
railties-3.2.5/lib/rails/tasks/misc.rake
railties-3.2.5/lib/rails/tasks/routes.rake
railties-3.2.5/lib/rails/tasks/statistics.rake
railties-3.2.5/lib/rails/tasks/tmp.rake
railties-3.2.5/lib/rails/test_unit/testing.rake

Wenn Ihr $EDITORkonfiguriert ist, können Sie sie mit dem open_gemEdelstein leicht selbst sehen :

gem install open_gem
gem open railties
AlexChaffee
quelle
2

So listen Sie alle Aufgaben auf:

rake -P

Da viele Aufgaben von Edelsteinen stammen, die Sie installieren, ist es schwer zu wissen, welche hinzugefügt werden ...

luigi7up
quelle
rails --helpkönnte helfen, einige der Aufgaben zu zeigen, die Rake nicht tut :guides.rubyonrails.org/command_line.html#bin-rails
wasabigeek