2012-04-07 6 views
0

ジェネレータ内でレーキタスクを実行できますか?私はシンプルなレールは、私が作っているエンジンの発電機を設置している

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 

ユーザーがrails g bouncer:installを実行すると、ロケールファイルが自分のアプリにコピーされます。マイグレーションでコピーしたいのですが、copy_fileメソッドを使用するよりも、私はコマンドラインから行うように、rake bouncer_engine:install:migrationsをジェネレータ内で実行できると思っていました。これどうやってするの?

答えて

3

これを行うための正しい方法:これは手間の節約も適切にタイムスタンプされて作ってください、各移行の名前の世話をする

#!/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 

1

まあ、シェルコマンドを実行するだけで可能だと思います。 Hereは、rubyでシェルコマンドを実行する6つの方法です。

しかし私の他の提案は、あなたのジェネレータの一部としてdireclyを実装するために、レーキタスクとして実装する代わりになるだろう...私はあなたの正確な要求が何であるか分からないが、移行タスクは、インストールタスクを実行するときに一度だけ実行されますか?それとも、レーキの仕事としてそれを提供する特別な必要性はありますか?

+0

ええ、私はそれをインストールタスクの一部として実行しようとしていますが、私はあなたがジェネレータの中でレーキタスクを実行できないのですか? – stephenmurdoch

+0

あなたのコードを再利用することで、私が知る限り、直接使用することはできません。しかし、あなたのコードからrakeコマンドをシェルコマンドとして実行すると、正しいディレクトリで実行するようにしてください。 – Vapire

+0

ああ、ありがとうございます。私は 'Rake :: Task ['rake bouncer_engine:install:migrations']。execute'を私のジェネレータの中から使用するようにしていましたが、今はあなたの言うことをやって、[this technique]を使ってファイルをコピーしますhttp://www.dixis.com/?p=444) – stephenmurdoch

関連する問題