我可以在发电机内运行rake任务吗?

时间:2012-04-07 11:01:09

标签: ruby-on-rails ruby-on-rails-3 rails-engines

我有一个简单的rails安装生成器,用于我正在制造的引擎:

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,就像我从命令行那样。我怎么能这样做?

2 个答案:

答案 0 :(得分: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 :(得分:1)

嗯,我认为应该可以通过执行shell命令来实现。 Here是在ruby中执行shell命令的6种不同方法。

但我的另一个建议是将其作为rake任务实施,而不是直接将其作为生成器的一部分实现......我不知道你的具体要求是什么,但鉴于你的描述,我认为执行安装任务时,迁移任务只运行一次?或者是否有特殊需要将它作为rake任务提供?