为Ruby宝石创建一个安装生成器



我对构建Ruby宝石还很陌生,正在尝试我的第一个。我正在为我的gem编写一个生成器,该生成器将在我的Rails应用程序中生成迁移。我希望简单地将gem包含在Rails应用程序中,运行"Rails g mygem:install"让它创建迁移,然后运行"rake db:migrate"完成所有操作。

我已经找到了几种不同的方法来完成类似的任务,但到目前为止还没有成功。我似乎无法让Rails应用程序找到生成器。我尝试过的最新指南位于此处:http://www.railsdispatch.com/posts/how-rails-3-enables-more-choices-part-1.

以下是我目前的宝石结构:

-lib/
-generators/
-templates/
-some_migration.rb
-install_generator.rb
-gemname/
-rails/
-railtie.rb
-engine.rb
-tasks/
-gemname.rake
-gemname.rb
-spec/
-gemname.gemspec

以下是我的install_generator.rb文件的样子:

require 'rails'
module Gemname
class InstallGenerator < ::Rails::Generators::Base
include Rails::Generators::Migration
source_root File.expand_path('../templates', __FILE__)
desc "add the migrations"
def self.next_migration_number(path)
unless @prev_migration_nr
@prev_migration_nr = Time.now.utc.strftime("%Y%m%d%H%M%S").to_i
else
@prev_migration_nr += 1
end
@prev_migration_nr.to_s
end
def copy_migrations
migration_template "some_migration.rb", "db/migrate/some_migration.rb"
end
end
end

我不确定是不是我遗漏了什么。我正在测试一个Rails 3.2应用程序,该应用程序的Gemfile中列出了我的gem,并且安装了gem。gem文件夹结构是否有任何问题,可能会阻止我的生成器出现?我需要找个地方吗?

感谢您的帮助。

Rails不再像以前那样默认自动加载lib中的所有内容。对于一些需要文件的方法,请查看这个问题的答案-从Rails 3中的lib文件夹加载模块/类的最佳方法?。

嗯,我不确定我所做的哪些更改解决了我的问题,但我做了以下操作:

将我的生成器的名称更改为gemname_generator.rb,并将生成器的目录结构更改为:

- lib/
-generators/
-templates/
-gemname_generator.rb

将此行添加到我的生成器:

namespace 'gemname'

我现在可以在rails应用程序中运行"railsgemname",并让它调用我的生成器。

最新更新