S.S.S. blog

アクセスカウンタ

help RSS Rakeが熱い

<<   作成日時 : 2007/01/28 21:29   >>

ブログ気持玉 0 / トラックバック 0 / コメント 6

Rakeにハマり中。こいつ、面白いし、使いやすい。

Rakeとは、Ruby実装のMakeというか、それを超えたツールである。Martin Fowlerがこれを気に入っていて、紹介ページを作っていたりする。

プログラマであれば、誰でも何かしらのビルドツールを使ったことがあると思う。C/C++であればMakeだし、JavaであればApache Antを使うだろう。IDEが発展した現在ではあるが、複雑なビルドを一手順で実現するバッチ形式のビルドは変わらず必要とされる。

ところで、俺はMakeもAntも使用した経験があるが、どちらも物足りなさを感じていた。

Makeはちょっと複雑なことをしようと思えばすぐにシェルスクリプト頼みとなってしまうし、Makefile内にシェルスクリプトを書こうと思えば、エスケープ連発の何か不自然な書き方になってしまう。また、実行環境に備わっているコマンドを呼び出すだけなので、貧弱なコマンドしか持たないWindows環境ではとても使いづらい。なにより、タブで始まった行はコマンド、などという間違いやすい文法が気に入らない。

AntはJava実装された環境非依存のビルドツールで、機能も豊富であるが、こいつに普通のプログラム的なこと・・・条件分岐やループ・・・を書こうと思うと、また気持ち悪い書き方を強要される。Antではビルド定義をXMLで書くが、XMLはこうしたプログラム的な処理を記述するのには全然向いていない。自分でタスクを定義することもできるが、後に他者に引き継ぐことを考えると、あまり余計なプログラムを組み入れたくない。

で、Rakeである。

Rakeのビルド定義はRakefileという名前のファイルとして作成され、中身はMakefileに似ている。

Makefileはこう。


default: hello

hello: hello.o foo.o bar.o
    cc -o $@ hello.o foo.o bar.o

hello.o: hello.c
    cc -c hello.c

foo.o: foo.c
    cc -c foo.c

bar.o: bar.c
    cc -c bar.c


対して、Rakefileはこう。


task :default => ["hello"]

file "hello" => ["hello.o", "foo.o", "bar.o"] do |t|
    sh "cc -o #{t.name} #{t.prerequisites.join(' ')}"
end

file "hello.o" => ["hello.c"] do |t|
    sh "cc -c hello.c"
end

file "foo.o" => ["foo.c"] do |t|
    sh "cc -c foo.c"
end

file "bar.o" => ["bar.c"] do |t|
    sh "cc -c bar.c"
end



ぱっと見た感じでは、Rakefileのほうが複雑になっており、単に面倒になるだけの気もする。しかし、驚くべきは、このRakefileをruby -cに食わせるとSyntax OK.になる点だ。つまり、Rakefileは見た目独自の言語で書かれているように見えるが、実は完全にRubyの文法に準拠したRubyスクリプトなのだ。

こうした実装形式を内部DSLと呼ぶ。これに対して、MakeやAntのように独自の言語を用いるタイプは外部DSLと呼ぶ。

内部DSLを採用したRakeは、ビルド定義中のどこであっても、Rubyという言語(とライブラリ)が持つあらゆる機能をそのまま使用することができる。そして、Rubyはオブジェクト指向言語としての高い完成度と、スクリプト言語としての簡便さを兼ね揃えた実に扱いやすく強力な言語だ。

これは実に助かる。MakeとAntに対して抱いていた不満が同時に解消される。文法は説得力がある。なにか複雑なことをしたいときも、いちいちプラグインを別に書いて追加してやる必要もない、直接Rakefileに書けばよいのだ。サブルーチンも使える、クラスも書ける。拡張は自由自在。

俺がAntを使う理由のほとんどは、強力なfilesetを使いたいが為であったが、それ相当の機能がRakeにもある(FileList)。もはや移行をためらう理由はない。

仕事でいくつかRakefileを書いて使っているが、実に扱いやすい。ビルドしたファイルをFTPで転送するのも簡単、特定のファイルの中身に変換をかけるのも正規表現を使えば楽勝、etc, etc,...と、実に役に立っている。

難点は、Rakeは当然ながら、Rubyもあちこちの環境に標準で搭載されている代物ではない、という点か。使いたければ、自分でインストールしなければならない。もっとも、rubygems(PerlでいうCPANみたいなことができる)経由で入れれば良いだけなので、大した苦労はないのだが。

あと、日本語の情報がほとんど無い。英語のマニュアルを読むのに慣れていれば、別に難しいツールではないので覚えるのは簡単なのだが、嘆かわしいことにプロのエンジニアの世界でも苦手な人間がほとんどだ。

Rakeは複雑なビルドの実装に四苦八苦するエンジニアへの福音となるかもしれない。どう利用していこうかという研究もちらほら見かける。まだ世に出て間もないので、導入は易しい作業ではないが、試してみる価値はある。内部DSLという代物を知る教材としてもいいかもしれない。

テーマ

関連テーマ 一覧

月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(6件)

内 容 ニックネーム/日時
Rake良さそうですね。
でもAntだけでもXSLTかけるだけで
ミラクルビルドができますよ。

あと、Groovy+Antもなかなかいい感じっす。
Swingが使えるので、ちょっとしたツール
がサックリ作れるのが便利です。
ティッシ
2007/01/29 21:07
XSLTでミラクルビルド・・・何をどうやるのかイメージが湧きませぬ。XSLTなんてXMLの書式整形やるだけのもんだと思ってますが、違うんですかね?

Groovyは相変わらず掘ってないなぁ。GUI的なビルドをしたかったら、SwingよりもスクリプトをキックするCGI作ったほうがいいような気もします。
いでさく
2007/01/29 22:29
>ミラクルビルド
XSLTでbuild.xmlを作るわけですな。
これにJavaScriptを組み合わせると、
もう何でもアリの世界に突入であります。

AntのいいところはXMLで書いてあるところで、
コードがデータとして扱えるので副産物が
簡単に作れることだと思うんですよね。
(build.xmlにXSLTかけてビルドの設定一覧やマニュアルを生成したり)

あとAnt Pretty BuildみたいにGUIを
つけたりとか、XSLT&JavaScriptとのコンボは
かなりおもしろい・・・。
(簡単かどかはおいておいて)

>Groovy
フォルダ選択ダイアログとかつまんない
入力をサッ出すのにGroovyでSwing書くと
1,2行で書けます。
さらにGroovyのコードはそのままclassに
コンパイルできるのでExecutableJARにして
納品したりとかもお手軽ですぞ。
JREのコアライブラリの大半はSwing関連
のクラスなので使ってあげないと損した感じだし。
ティッシ
2007/01/30 00:33
ところでJRakeって結構動きますな。
ティッシ
2007/01/30 00:35
>XSLT
な、なるほど。
AutomakeでMakefile作るようなもんですかね?俺よかよっぽどAntをHackしてますな。

SwingはJRE1.3時代で使ったきりご無沙汰ですわい。でも、Groovyで簡単にできますか。復権の予感。

>JRake
JRubyでRake動かすってやつでしたっけ?これでAntともオサラバだ!みたいな情報をちらほら聞きます。

うーん、どうなんだろう?単にJavaプログラムをビルドしたいだけならAntのほうが手早いんですよね。すごく複雑な手順を踏むのであれば、選択肢として悪くないと思いますが。
いでさく@管理人
2007/01/30 00:46
>Ant
いでさく卿のすすめではじめて早ン年、覚えて
ホントに良かった最高のツールです。
NAntもわりと使いやすいです。

>JRake
JRubyって密かにRubyより好きです。
案外コンパクトだし。
ティッシ
2007/01/30 08:04

コメントする help

ニックネーム
本 文
Rakeが熱い S.S.S. blog/BIGLOBEウェブリブログ
[ ]