2012-04-07 6 views
0

Ich habe eine einfache Schienen installieren Generator für einen Motor Ich mache:Kann ich eine Rake-Task in einem Generator ausführen?

module Bouncer 
    module Generators 
    class InstallGenerator < Rails::Generators::Base 
     source_root File.expand_path("../../templates", __FILE__) 

     desc "Copies locale file and migrations to your application." 

     def copy_locale 
     copy_file "../../../config/locales/en.yml", "config/locales/bouncer.en.yml" 
     end 

     def copy_migrations 
     # I would like to run "rake bouncer_engine:install:migrations" right here 
     # rather than copy_file "../../../db/migrate/blah.rb", "db/migrate/blah.rb" 
     end 
    end 
    end 
end 

Wenn ein Benutzer rails g bouncer:install, eine locale-Datei in ihre App kopiert wird. Ich möchte auch in meine Migrationen kopieren, aber anstatt copy_file Methode zu verwenden, hatte ich gehofft, ich könnte einfach rake bouncer_engine:install:migrations innerhalb des Generators ausführen, wie ich von der Befehlszeile aus tun würde. Wie kann ich das machen?

Antwort

3

Der richtige Weg, dies zu tun:

#!/usr/bin/env rake 
module Bouncer 
    module Generators 
    class InstallGenerator < Rails::Generators::Base 
     desc "Copies migrations to your application." 
     def copy_migrations 
     rake("bouncer_engine:install:migrations") 
     end  
    end 
    end 
end 

Das eine Menge Ärger erspart und kümmert sich sogar um die sicherstellen, dass die Namen der einzelnen Migration richtig timestamped wird.

1

Nun, ich denke, es sollte möglich sein, indem Sie nur den Shell-Befehl ausführen. Here sind 6 verschiedene Möglichkeiten, einen Shell-Befehl in Ruby auszuführen.

Aber mein anderer Vorschlag wäre, anstatt es als Rake-Aufgabe zu implementieren, um es direkt als Teil Ihres Generators zu implementieren ... Ich weiß nicht, was Ihre genauen Anforderungen sind, aber angesichts Ihrer Beschreibung scheint es mir dass der Migrations-Task nur einmal ausgeführt wird, wenn Sie die Installationsaufgabe ausführen? Oder muss man es auch als Rake-Aufgabe anbieten?

+0

yeah, ich versuche es als Teil der Installationsaufgabe laufen zu lassen, ich nehme an, Sie können nicht einfach eine Rake-Aufgabe in einem Generator ausführen? – stephenmurdoch

+0

Nicht direkt durch die Wiederverwendung Ihres Codes, soweit ich weiß. Aber das Ausführen des Rake-Befehls als Shell-Befehl aus Ihrem Code sollte funktionieren ... Sie müssen nur sicherstellen, dass Sie es im richtigen Verzeichnis ausführen – Vapire

+0

ahh, danke für Ihre Informationen. Ich wollte "Rake :: Task ['rake bouncer_engine: install: migrations']. Execute 'aus meinem Generator heraus verwenden, aber jetzt mache ich einfach das, was Sie sagen und kopieren die Dateien mit [dieser Technik] (http://www.dixis.com/?p=444) – stephenmurdoch

Verwandte Themen