2009-12-10 10 views
57

1) Gibt es einen 'besten' Platz für Rechenaufgaben in Edelsteinen? Ich habe sie in/tasks,/lib/tasks gesehen, und ich habe sie als * .rb und * .rake geschrieben - nicht sicher, welche (wenn überhaupt) "korrekt" isteinschließlich Rechenaufgaben in Edelsteinen

2) Wie funktioniert Ich stelle sie der App zur Verfügung, sobald der Edelstein in der Umgebung konfiguriert ist?

+1

Sollte weiter verfolgen eine bessere Antwort- Ich schlug meinen Kopf an der Wand, wenn Sie versuchen, facebooker Arbeit zu bekommen- das ist als ein Juwel, aber es funktioniert nicht, weil alle Rake Aufgabe Abhängigkeiten im Grunde tot sind. –

+0

das hat mir geholfen: http://blog.nathanumbert.com/2010/02/rails-3-loading-rake-tasks-from-gem.html – User

Antwort

44

Auf Schienen 3, tun Sie dies über Railties. Hier ist der Code für ein Juwel zu tun ich gerade gemacht:

class BackupTask < Rails::Railtie 
    rake_tasks do 
    Dir[File.join(File.dirname(__FILE__),'tasks/*.rake')].each { |f| load f } 
    end 
end 

So können Sie im Grunde eine Klasse erstellen, erbt von Rails :: Railtie, dann innerhalb dieser Klasse Sie einen rake_tasks Block haben, der die entsprechenden Dateien lädt. Sie müssen anstelle von require laden, wenn Sie eine .rake-Erweiterung verwenden möchten.

Ich fand, dass ich den vollständigen Pfad zu Dir angeben muss (daher die File.join Gymnastik). Wenn ich die Datei nur explizit auflisten wollte, könnte ich einfach "load 'tasks/foo.rake'" sagen, weil sich das lib-Verzeichnis meines Edelsteins im Ladepfad befand.

+2

Wüssten Sie, wie man Rake-Aufgaben in ein Nicht-Rails-Projekt einfügt? – lulalala

+1

+1 für diese Antwort in Rails 4, es ist gut dokumentiert [hier] (http://edgeapi.rubyonrails.org/classes/Rails/Railtie.html). Für Nicht-Schienen, siehe [dieser Beitrag] (http://stackoverflow.com/questions/13858495/ruby-accessing-rake-task-from-a-gem-without-rails) – zrisher

+0

bestätigt funktioniert auch auf Schienen 4.2 – equivalent8

31

Entweder /tasks und lib/tasks sind ein guter Ort. Ich benutze /tasks, wenn die Aufgaben zum Arbeiten oder Verwalten des Gem selbst verwendet werden sollen, verwende ich lib/tasks, wenn die Aufgaben von Gem-Benutzern geladen werden sollen.

Dies liegt daran, dass Benutzer möglicherweise ein Problem beim Laden von Ruby-Dateien außerhalb des Ordners lib haben, der automatisch an den Ladepfad angehängt wird, wenn der Gem benötigt wird.

Außerdem empfehle ich Ihnen, die * .rake Erweiterung zu verwenden. Heutzutage assoziiert fast jede IDE eine Erweiterung von Ruby-Dateien mit .rake, und die fortschrittlichste IDE kann den Inhalt sogar als Rake-Skripte analysieren. Die Erweiterung ist auch für Entwickler eine bessere Wahl, da Sie einen sofortigen Überblick über den Inhalt der Datei geben können.

Über Ihre zweite Frage, derzeit gibt es keine Möglichkeit, Rails Ihre Rake-Aufgaben zu laden, wenn das Plugin als Gem verpackt ist. Sie müssen die Rake-Datei in Ihre Anwendung (in eine andere Rake-Datei oder in die Haupt-Rake-Datei) aufnehmen oder die Rake-Aufgaben in Ihrem Projekt klonen.

Wenn Sie das Plug-in im Lieferantenordner installieren, werden alle Dateien *.rake in den Verzeichnissen tasks und lib/tasks automatisch durch die folgenden zwei Zeilen in den Rails-Bereich geladen.

Dir["#{RAILS_ROOT}/vendor/plugins/*/tasks/**/*.rake"].sort.each { |ext| load ext } 
Dir["#{RAILS_ROOT}/vendor/plugins/*/lib/tasks/**/*.rake"].sort.each { |ext| load ext } 
+0

Und wo würde ich diese zwei Zeilen beginnend mit Dir? Ist diese Antwort immer noch gültig für Rails 4? – Spundun

+0

Die erste Hälfte dieser Antwort ist großartig. Die zweite Hälfte scheint Rails 3 vorauszugehen und ist veraltet. Verwenden Sie ein Railtie, damit Rails die Tasks lädt, wie @ edebills Antwort erklärt. – drewish

11

für Rails 3 Unterstützung, die oberste Zeile Ihres lib/.rb Datei kann sein:

Dir["tasks/**/*.rake"].each { |ext| load ext } if defined?(Rake) 

für Rails 2-Unterstützung, die gem-Installer ihre Rakefile bearbeiten müssen wird, und fügen Sie:

Dir["#{Gem.searcher.find('<gemname>').full_gem_path}/lib/tasks/**/*.rake"].each { |ext| load ext } 

nach den Anweisungen erforderlich.

HINWEISE:

  • Seien Sie sicher, mit dem Namen Ihres tatsächlichen Edelstein zu ersetzen.
  • Dies setzt voraus, alle Rails-sichtbar Rake Aufgaben sind in lib/Aufgaben/

ich nichts leichter noch gefunden zu haben. Bemerkungen?

Verwandte Themen