Railsのカスタムgeneratorの、グループ分けをする

今回のお題

Railsのカスタムgeneratorは、以下のように「Rails」「Rspec」といったグループに分けられています。このグループ分けはどのようにするのでしょうか?

$ rails generate
--- 以下、実行結果 ---
Usage: rails generate GENERATOR [args] [options]

General options:
  -h, [--help]     # Print generator's options and usage
  -p, [--pretend]  # Run but do not make any changes
  -f, [--force]    # Overwrite files that already exist
  -s, [--skip]     # Skip files that already exist
  -q, [--quiet]    # Suppress status output

Please choose a generator below.

Rails: <- ここ
  controller
  generator
  helper
  integration_test
  mailer
  migration
  model
  observer
  performance_test
  plugin
  resource
  scaffold
  scaffold_controller
  session_migration
  stylesheets

Initializer: <- ここ
  initializer

Rspec: <- ここ
  rspec:controller
  rspec:helper
  rspec:install
  rspec:integration
  rspec:mailer
  rspec:model
  rspec:observer
  rspec:scaffold
  rspec:view

試行錯誤

試しに、rails generate generatorで自動生成したgenerator(ここではrails generate generator initializerしたものを想定)を修正して、名前空間を分けてみましょう。

module AppName
  class InitializerGenerator < Rails::Generators::NamedBase
    (省略)
  end
end

すると、どうでしょう。rails generateとしても「Initializer:」すら表示されなくなりましたorz
単純に名前空間を分けただけではだめなんですね。
続いて、initializerディレクトリをapp_nameディレクトリ以下に移動してみましょう。つまり、以下のようなディレクトリ構成にします。

lib
`-- generators
    `-- app_name
        `-- initializer

今度は、rails generateで期待通りに表示されます。

(以下、rails generateの実行結果)
AppName:
  app_name:initializer

いいね。さっそく実行してみます。

$ rails generate app_name:initializer
Usage:
  rails generate initializer NAME [options]

Runtime options:
  -f, [--force]    # Overwrite files that already exist
  -p, [--pretend]  # Run but do not make any changes
  -q, [--quiet]    # Supress status output
  -s, [--skip]     # Skip files that already exist

Description:
    Explain the generator

Example:
    rails generate initializer Thing

    This will create:
        what/will/it/create

うんうん、いいですね。

まとめ

Railsのカスタムgeneratorのグループ分けは、

  • lib/generators/<グループ名>/に配置
  • <グループ名>名前空間にgeneratorを定義

といった手順でできます。

--- PR広告
記事を読んでくださり、ありがとうございます。もしよろしければ、この記事の著者が提供している無料のサービス「かくってる?」をお試しください。