Rakeに入門
やれば簡単そうだけど、いままでやってなかったRakeについて調べた。
練習としてsubversionのリポジトリからコードをチェックアウトして、シンボリックリンクを張りなおすというcapistranoっぽい作業を自動化する。
やりたいこと
ファイル構成はこんな感じ
--Rakefike +current -> /releases/2010051101 (releasesの最新にシンボリックリンク) +-releases +2010051101 +2010051102 +2010051103
以下のような作業を自動化するのが目標
mkdir releases/2010052501 svn checkout svn://example.com/project/trunk releases/2010052501 ln -s releases/2010052501 current
まず外枠をつくる
$ nano Rakefile
で、なにもしないRakefileをつくる
task :default => "deploy" desc "プロジェクトをデプロイする" task :deploy desc "コード群をチェックアウトする" task :checkout desc "currentへのシンボリックリンクを付け替える" task :switch
正しく定義されているか実行してみる。(-tは実行順序を確認するためのオプション)
$ rake -t (in /home/toyoshi/rake) ** Invoke default (first_time) ** Invoke deploy (first_time) ** Execute deploy ** Execute default
defaultタスクは実行するタスクを指定しないときに実行されるタスク名なので最初に呼ばれる
今回はdefaultに=>でdeployを依存タスクとして指定しているので先にdeployが実行される。
deskというのはオプションのコマンドである。あとで「どんなタスクがあるんだっけ?」って時に-Tオプションで見れる
以下のような感じ
$ rake -T (in /home/toyoshi/rake) rake checkout # コード群をチェックアウトする rake deploy # プロジェクトをデプロイする rake switch # currentへのシンボリックリンクを付け替える
さらにdeployからcheckoutとswitchを呼ぶように依存関係を追加すると、以下のようになる
task :default => "deploy" desc "プロジェクトをデプロイする" task :deploy => [:checkout, :switch] desc "コード群をチェックアウトする" task :checkout desc "currentへのシンボリックリンクを付け替える" task :switch
これを実行してみると
$ rake -t (in /home/toyoshi/rake) ** Invoke default (first_time) ** Invoke deploy (first_time) ** Invoke checkout (first_time) ** Execute checkout ** Invoke switch (first_time) ** Execute switch ** Execute deploy ** Execute default
deployの前にswitchとcheckoutタスクが実行されるようになった。
完成させる
あとは直感的にコマンドを並べるだけだ。
rakeではfileutilsモジュールが使えるので便利。
DIR_NAME = "releases/" + Time.now.strftime("%Y%m%d%H%M%S") task :default => "deploy" desc "プロジェクトをデプロイする" task :deploy => [:checkout, :switch] desc "コード群をチェックアウトする" task :checkout do mkdir_p DIR_NAME sh "svn co http://example.com/svn/trunk #{DIR_NAME}" end desc "currentへのシンボリックリンクを付け替える" task :switch do symlink(DIR_NAME, "current") end
実行する
$ rake -t (in /home/toyoshi/rake) ** Invoke default (first_time) ** Invoke deploy (first_time) ** Invoke checkout (first_time) ** Execute checkout mkdir -p releases20100525093633 svn co http://example.com/svn/trunk releases/20100525093633 A releases20100525093633/tasks A releases20100525093633/tasks/empty A releases20100525093633/templates A releases20100525093633/templates/empty リビジョン 15 をチェックアウトしました。 ** Invoke switch (first_time) ** Execute switch ln -s releases20100525093633 current ** Execute deploy ** Execute default
ファイル構成
$ ls -la Rakefile current -> releases/20100525092712 releases --20100525092556 --20100525092628 --20100525092712 --20100525093633
まとめ
よくわからないと思っていたけど、基本的にはコマンドを並べるだけで使える。
その他にもRubyクックブックではドキュメントの自動生成や、ファイルのクリーンアップ、ビルド、統計の取得などの例が紹介されていた。
特に今回使わなかったfileタスクというやつは、ファイルを生成するときに依存関係をみて自動でファイル生成が必要かどうかを判断してくれたりして
効率的なビルドや生成ができるような仕組みになっている。
とりあえず僕のレベルではコマンドラインオプションの処理などを自分でかかなくて良いというだけでも十分に使う価値があるように思いました。
参考サイト
Rake(実用的な例をあげて簡潔にまとめられており、とても分かりやすいです)
- 作者: Lucas Carlson,Leonard Richardson,株式会社クイープ
- 出版社/メーカー: オライリー・ジャパン
- 発売日: 2007/04/27
- メディア: 大型本
- 購入: 1人 クリック: 73回
- この商品を含むブログ (55件) を見る