no_picture

rails new した時の追加処理をかく

この記事はメモです。 広島Ruby勉強会 #33 で LT するのに下調べしたことを書いてるだけです。 rails new した時に --template file_or_url というオプションがあります。省略形は -m。 これを使うと、rails new した時に追加処理ができます。 「テンプレート機能」と呼びたいと思います。 何がしたいかというと rails new した時点で pry とか rspec とか cucumber とかいつも使うのを設定した状態にしたいのです。 ウェブサービスが思いついたら直ちに開発をしたいのです。 このテンプレート機能を使うものとしては Rails Composer というものがあります。 これを使うと、どのライブラリを利用するか質問されるので、回答していくと、雛形ができます。 これを自分でカスタマイズしたいので、いろいろ調べました。 役に立つかもしれないウェブページ Rails Application Templates - Rails Guide Creating and Customizing Rails Generators & Templates - Rails Guide RailsのApplication templateを使って開発の初速をあげよう! ひとつめの「Rails Application Templates」は Rails Guide ですが、Rails Guide のトップにリンクがありません。 だいぶ調べた後に気づきました。泣きたい。 ふたつめも Rails Guide ですが、機能的には Generator と同じなので参考になります。 みっつめは日本語記事。面白くまとめてあります。このメモを書いてLTをつくった後にみつけた。 つづいて、関係してきそうなクラスやモジュールを整理します。 Rails::AppBuilder Rails::Generators::AppGenerator Rails::Generators::AppBase Rails::Generators::Base Rails::Generators::Actions Thor::Actions Thor::Group Thor::Shell Thor::Invocation Thor::Base --template に指定したファイルは Rails::Generators::AppGenerator インスタンスのコンテキストで実行されます。 Rails::Generators::AppGenerator が継承してるクラスやミックスインしているモジュールのメソッドが使えると考えてください。 「instance_eval される」と書いたほうがわかりやすい人もいるとかもしれません。 rails new や rails generator には、Thor というライブリが使用されています。 bundler や Vagrant でも利用されているそうです。 もっと詳しいことを知りたいのであれば、 Github のリボジトリやWikiをみるとよさそうです。 Thor についてはまだ勉強中でまだよくわかりませんが、コマンドラインから実行するプログラムを作成するのを支援するようです。 継承関係は、 Rails::Generators::AppGenerator < Rails::Generators::AppBase < Rails::Generators::Base - [Thor::Actions, Rails::Generators::Actions] < Thor::Group - [Thor::Base, Thor::Shell, Thor::Invocation] となっていて、 < は継承しているところで - はミックスインしているところです。 Rails::AppBuilder には Rails::Generators::AppGenerator で使用するレシピが書いてある感じになっています。 Rails::Generators::AppGeneratorに定義されているメソッドは Thor::Group の規約により、定義された順番に実行されるようになっています。 --templateに指定したファイルが実行されるのは最後から二番目になります。 最後はrun_bundle が実行されます。これは bundle install が実行されます。 rails generator に対応したクラスのを多くは Rails::Generators::NamedBase を継承しています。 継承関係は Rails::Generators::NamedBase < Rails::Generators::Base となっているので、両者に共通するものが Rails::Generators::Base になることがわかりました。 rails new する時の処理をまるまる変更したいのであれば Rails::AppBuilder を継承して::AppBuilder を作成すればできそうな感じでした。 ベースになるクラスは railties/lib/rails/generators にあります。 generatorとして利用できるものは、ここに配置されているディレクトリに配置されています。 ないものもありますが、rails g --help に表示されるものと概ね対応しています。 find -maxdepth 2 -type d .