はじめに
Rails2.3.1が出ていたので、リリース情報を読み返していたらApplication Templateという素敵機能が2.3から使える事がわかった。
Railsを止められない理由の一つに、プロジェクトを作り始めてから実際に動作するまでが非常にラクチンだという事がある。
例えば:
CODE:
- % rails Todo
- % cd Todo
- % script/generate scaffold todo title:string finished:boolean
- % rake db:migrate
- % script/server
このたった5行のコマンドで簡単なToDoアプリが出来上がっている。
しかしモックならまだしも実運用するためのプロジェクトを作ろうと思ったら、必要なプラグインを入れたり、いつも使う拡張コードを書いたり、さすがのRailsでも毎回粛々とした作業は必要だ。
コマンド一発でいつも使うプロジェクトのセッティングまでしてくれればいいのに!そんなRailsエンジニアが誰しも望んでいたであろう機能が「Application Template」だ。
Application Templateとは何か?
Railsのプロジェクトにプラグインをインストールしたりgemを展開したり、ルートを設定したり、その他初期設定にまつわる様々な処理を自動化するための機能です。
- DSLを使ったシンプルなRubyファイル、もしくはテキストファイルをテンプレートファイルとする
- テンプレートファイルはローカルでもリモートでもOK。gist.github.comに置くのがベターかも。
- 初期設定の自動化は、新規プロジェクトでも既存プロジェクトでもOK。
Gistで自動化ファイルを共有しちゃいなよ、YOU!
超簡単なテンプレートの例
CODE:
- # template.rb
- run "rm public/index.html"
- generate(:scaffold, "todo title:string finished:boolean")
- route "map.root :controller => 'todos'"
- rake("db:migrate")
- git :init
- git :add => "."
- git :commit => "-a -m 'Initial commit'"
これをgistにアップして
CODE:
- % rails todo -m http://gist.github.com/74747.txt
- create
- create app/controllers
- (中略)
- applying template: http://gist.github.com/74747.txt
- executing rm public/index.html from /Users/haga/Desktop/todo
- generating scaffold
- route map.root :controller => 'todos'
- rake db:migrate
- running git init
- running git add .
- running git commit -a -m 'Initial commit'
- applied http://gist.github.com/74747.txt
rails コマンドに-mオプションでgistのURLを渡してやれば、いつものプロジェクト生成後、テンプレートによる自動化が行われているのがわかりますね!
テンプレートで使えるDSL
gem(name, options = {})
- config/environment.rbにconfig.gemを追加する
plugin(name, options = {})
-プラグインをインストールする
initializer(filename, data = nil, &block)
- config/initializersに初期化スクリプトを作成する
- 同じようにlib()やvendor()といったメソッドもある。
rakefile(filename, data = nil, &block)
- lib/tasksにrakeファイルを作成する
generate(what, args)
- generatorスクリプトを実行する
run(command)
- shellコマンドを実行する
rake(command, options = {})
- rakeコマンドを実行する
route(routing_code)
- config/routes.rbにルート定義を追加する
inside(dir)
- ディレクトリの中でコマンドなどを実行する
ask(question)
- ユーザーからの入力を取得する
yes?(question) or no?(question)
- y/n形式の入力を待つ
git(:must => “-a love”)
- gitコマンドを実行する
参考ページ
さいごに
各DSLの深追いは次のエントリーでやる予定