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、コマンドラインから実行するのと同じように、ジェネレーター内で実行できることを望んでいました。これどうやってするの?

4

2 に答える 2

4

これを行う正しい方法:

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

これにより、多くの手間が省け、各移行の名前に適切なタイムスタンプが付けられるようになります。

于 2012-04-08T20:04:32.713 に答える
1

そうですね、シェルコマンドを実行するだけで可能になると思います。rubyでシェルコマンドを実行する6つの異なる方法があります

しかし、私の他の提案は、それをレーキタスクとして実装する代わりに、ジェネレータの一部として直接実装することです...あなたの正確な要求が何であるかはわかりませんが、あなたの説明を考えると、移行-インストールタスクを実行するときに、タスクは1回だけ実行されますか?それとも、レーキタスクとしても提供する特別な必要性がありますか?

于 2012-04-07T11:19:35.620 に答える