Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rails 3 generators in gem

Might sound like a simple question, but I'm stumped.

I've created a gem that essentially contains a generator.

It contains the following structure:

lib
 - generators
    - my_generator
          my_generator_generator.rb (see below)
          - templates
             my_template_files...     
 - my_generator.rb (empty file)
test
 -test files
GemFile
etc..

However when I add this Gem to my gem file and run rails g, it's not listed. Is there any additional config that I need to do?

My generator roughly looks like this...

class MyGeneratorGenerator < Rails::Generators::NamedBase
      source_root File.expand_path('../templates', __FILE__)
      generator code....
 end

The strange thing is, it works in Cygwin, but not in Ubuntu...

like image 750
Yule Avatar asked Apr 07 '11 07:04

Yule


2 Answers

This took a little bit for me to figure out, but I've run into the same problem. Here is how I fixed it.

Tree structure looks like this:

lib
  - generators
    - gemname
      install_generator.rb
      - templates
        (template files)

Here's the code for 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

When I run rails g

I see:

Gemname
   gemname:install

Some other things you may need to setup:

#lib/gemname.rb
module Gemname
  require 'gemname/engine' if defined?(Rails)
  # any additional requires
end

and

#/lib/gemname/engine.rb
require 'rails'
module Gemname
  class Engine < Rails::Engine
  end
end

Some good references I've found on this are:

  • http://textmate.rubyforge.org/thor/Thor.html (take a look at the modules, especially 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/
like image 150
Mike Farmer Avatar answered Sep 29 '22 14:09

Mike Farmer


If you use Railtie, you can define your generator wherever it could be using:

generators do
    require "path/to/my_railtie_generator"
end

in Railtie class.

like image 38
freeze Avatar answered Sep 29 '22 13:09

freeze