#ruby-on-rails #ruby-on-rails-3 #rubygems #generator
#ruby-on-rails #ruby-on-rails-3 #rubygems #генератор
Вопрос:
Может показаться простым вопросом, но я в тупике.
Я создал gem, который по сути содержит генератор.
Он содержит следующую структуру:
lib
- generators
- my_generator
my_generator_generator.rb (see below)
- templates
my_template_files...
- my_generator.rb (empty file)
test
-test files
GemFile
etc..
Однако, когда я добавляю этот Gem в свой файл gem и запускаю rails g, его нет в списке. Есть ли какая-либо дополнительная конфигурация, которую мне нужно сделать?
Мой генератор примерно выглядит так…
class MyGeneratorGenerator < Rails::Generators::NamedBase
source_root File.expand_path('../templates', __FILE__)
generator code....
end
Странно то, что это работает в Cygwin, но не в Ubuntu…
Комментарии:
1. Это та же версия ruby / rails?
2. Да. Оба ruby 1.8, Rails 3.0
Ответ №1:
Мне потребовалось немного времени, чтобы разобраться, но я столкнулся с той же проблемой. Вот как я это исправил.
Древовидная структура выглядит следующим образом:
lib
- generators
- gemname
install_generator.rb
- templates
(template files)
Вот код для install_generator.rb
#lib/generators/gemname/install_generator.rb
require 'rails/generators'
module Gemname
class InstallGenerator < Rails::Generators::Base
desc "Some description of my generator here"
# Commandline options can be defined here using Thor-like options:
class_option :my_opt, :type => :boolean, :default => false, :desc => "My Option"
# I can later access that option using:
# options[:my_opt]
def self.source_root
@source_root ||= File.join(File.dirname(__FILE__), 'templates')
end
# Generator Code. Remember this is just suped-up Thor so methods are executed in order
end
end
Когда я запускаю
rails g
Я вижу:
Gemname
gemname:install
Некоторые другие вещи, которые вам могут понадобиться для настройки:
#lib/gemname.rb
module Gemname
require 'gemname/engine' if defined?(Rails)
# any additional requires
end
и
#/lib/gemname/engine.rb
require 'rails'
module Gemname
class Engine < Rails::Engine
end
end
Вот несколько хороших ссылок, которые я нашел по этому поводу:
- http://textmate.rubyforge.org/thor/Thor.html (взгляните на модули, особенно на Thor::Actions)
- http://api.rubyonrails.org/classes/Rails/Generators/Base.html
- http://api.rubyonrails.org/classes/Rails/Generators/Actions.html
- https://github.com/wycats/thor/blob/master/README.md
- http://www.themodestrubyist.com/2010/03/16/rails-3-plugins—part-3—rake-tasks-generators-initializers-oh-my/
Комментарии:
1. Спасибо. Это потрясающе. Подумал, что мне, должно быть, не хватает какого-то установочного файла. Отдаю должное исходному коду. Ссылки тоже полезны, спасибо.
Ответ №2:
Если вы используете Railtie, вы можете определить свой генератор везде, где он мог бы использоваться:
generators do
require "path/to/my_railtie_generator"
end
в классе Railtie.