記事の引越しから漏れていたのでサルベージ。

Generatorプラグインの作り方をメモしておきます。

まずはプラグインの雛形を作ります。

   1  $ ./script/generate plugin foo

次にGeneratorプラグインに必要なディレクトリを用意。

   1  $ mkdir -p vendor/plugins/foo/generators/foo/templates

FooGeneratorクラスの定義ファイルを作成

vendor/plugins/foo/generators/foo/foo_generator.rb

   1  class FooGenerator < Rails::Generator::NamedBase
   2    def initialize(runtime_args, runtime_options = {})
   3      super
   4      ~ 引数・オプションの解釈と初期化 ~
   5    end
   6  
   7    def manifest
   8      record do |m|
   9        ~ マニフェスト ~
  10      end
  11    end
  12  end

マニフェストの書き方は この辺 が参考になります。基底クラスは、Rails::Generator::Baseの派生クラスなら何でもOKです。

続いて、マニフェストから参照するテンプレートファイルをtemplatesディレクトリの中に作ります。テンプレートファイルはERbテンプレートなので、Generatorクラスのコンテクストでrhtmlを書くような感じで記述できます。

以上で完了。Generatorを使うときは以下の通り。

   1  $ ./script/generate foo 

マニフェストの書式を以下にまとめておきます。

m.class_collisions( *class_names)

生成するクラス名の衝突を検出します。 Generatorで生成する予定のクラス名をすべて列記しておきましょう。

m.directory(relative_path)

RAILS_ROOTからの相対パスで、指定したディレクトリを利用する事を 宣言します。

m.template(relative_source, relative_destination, template_options = {})

Generatorが生成するファイルを宣言します。relative_sourceは、templatesディレクトリからの相対パスでERbテンプレートを指定します。relative_destinationには生成されるファイルの場所をRAILS_ROOTからの相対パスで記述します。

template_optionsには、:assigns => {:foo => some_thing} のような感じで、ERbテンプレートから参照可能な値を設定する事ができます。

m.readme( *relative_sources)

helpドキュメントを指定します。指定したファイル群は単純に連続出力されます。

m.migration_template(relative_source, relative_destination, template_options = {})

migrationファイルの生成を宣言します。migrationファイルは、ファイル名の先頭に005_のようなプレフィックスが付くので、専用のメソッドが用意されています。

relative_destinationは、migrationファイルを配置するディレクトリを、RAILS_ROOTからの相対パスで指定します。生成するファイル名は、template_options[:migration_file_name] で明示的に指定するか、さもなくばGeneratorの引数から自動的に決定されます。

そのほかの挙動はm.templateと同じです。 

m.dependency(generator_name, args, runtime_options = {})

Generatorの依存関係を宣言します。これによってメタジェネレータを記述する事も可能です。素晴らしいですね。

m.file(relative_source, relative_destination, file_options = {}) {|sf| ...}

ファイルのコピーを宣言します。relative_sourcerelative_destination はそれぞれRAILS_ROOTからの相対パスです。 file_optionsには、:chmod, :shebang, :collisionを指定します。 詳細な挙動については こちら を参照のこと。

ブロック引数は、relative_sourceで指定したファイルが何らかのテンプレートファイルであるときに、テンプレートを展開する処理を記述します。そうでない場合は省略可能です。

より詳細な情報が必要な場合は、 Rails::Generator::Commands::Createクラスのドキュメント 及び Createクラスの基底クラスであるRails::Generator::Commands::Baseのドキュメント をご覧ください。

更新履歴

  • 2006/08/10 マニフェストの書き方を最後の方にまとめておきました。
  • 2007/11/22 記事の移行からもれていたのでサルベージ
posted by Png genki on Thu 22 Nov 2007 at 05:10

Comments:

or Preview
Social Bookmarks
  • Delicious
  • B_entry215
  • Clip_16_12_w
Services from s21g
twpro(ツイプロ)
Twitterプロフィールを快適検索
地価2009
土地の値段を調べてみよう
MyRestaurant
自分だけのレストラン手帳
Formula
ブログに数式を埋め込める数式コミュニティ