kなんとかの日記 このページをアンテナに追加

2008-02-20

Python で Rake を真似るとしたら

| 00:08 |  Python で Rake を真似るとしたらを含むブックマーク


Python でも distutils を使うと Rake みたいなことができるよという話。

でも distutils って、依存性を解決してくれたっけ? たとえばタスク A を実行するためにはタスク B と C を先に実行しなければいけない、というような依存関係。これができないと、distutils は Rake のかわりにはならない。せいぜい shell script のかわりという程度。

しかし、Rake のような DSL を使うと、Ruby のブロック構文が実によくできていることに感心する。ほんと、ブロック構文がなければ Rake は生まれなかったであろう。

これを Python で真似するにはどうしたらいいか。あんまりいいアイデアはないけど、「@hogehoge」を使った修飾子を使えばなんとかなるのかな。

@task('compile')
@desc('compile *.c into *.o')
@target('%.o')
@depends('%.c')
def compile(files):
    os.system("gcc %s" % files[0])

あんまり格好よくないな。Python の def は拡張できないけど、Ruby のブロック構文は自分で関数を定義すればあたかも専用の構文を用意したように使える。RubyDSL に向くのはブロック構文サマサマだよな。

yuinyuin 2008/02/21 09:40 参照元記事のブログの中の人です。

distutilsにはsub_commandsがありますが、sub_commandsではダメでしょうか?

>sub_commandsは コマンドの``ファミリー’’を定式化したものです。たとえば install は サブコマンド install_lib、install_headersなどの親です。コマンドファミリーの親は sub_commandsをクラス属性として持ちます。 2要素のタプル”(command_name, predicate)”のリストで、 command_nameには文字列、predicateには親コマンドのメソッドで、現在の状況がコマンド実行にふさわしいかどうか判断するものを指定します。 (例えば install_headers はインストールするべき Cヘッダファイルがある時だけ有効です。) もし predicate が None なら、そのコマンドは常に有効になります。

まぁビルドにかぎっていえばSconsを使うのがPythonでの正解だと思います。

トラックバック - http://d.hatena.ne.jp/kwatch/20080220/1203520081