『PythonでRakeもどきを作ってみた』

makoto kuwata <kwa@kuwata-lab.com>
1

pyKook - Python版 Rake
タスク定義をPythonで記述
タスク処理を「料理」に例える
Recipe (タスク定義), Cookbook (定義ファイル),Product (生成物), Ingredient (材料), ...

http://www.kuwata-lab.com/kook/pykookusers-guide.html

LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved2

タスク定義Kookbook.py@recipe をつけるとタスク定義に@recipe
def clean(c):'''remove *.o files'''rm_rf("**/*.o")関数ドキュメントがタスクの摘要にコマンドでは「**/」が利用可能

LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved3タスクの一覧と実行タスクの実行

タスク一覧の表示

sh> kk clean### * clean (recipe=clean)$ rm -rf **/*.osh> kk -l
Properties:

・kk または pykook で起動・-l または -L で一覧表示

Task recipes:
clean: remove *.oFile recipes:

LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved4ファイル生成ルール
Kookbook.py@product() にパターンを指定@ingreds() で材料を指定もしファイルが存在するなら@recipe@product('*.o')@ingreds('$(1).c', if_exists('$(1).h'))def file_o(c):'''compile *.c into *.o'''system(c%"gcc -c $(ingred)")

キーワードや変数を埋め込み可能（例: $(ingred) は最初の材料を表す）
LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved
5内容が変更されたか確認
hello

タイムスタンプだけ更新される

X

コンパイル

hello.o

ファイルの内容に変更なし

コンパイル

hello.c
LLTV 2009 Lightning Talk

コメントだけを変更して「kk hello」を実行

copyright© 2009 kuwata-lab.com all rights reserved6タスク別オプション
Kookbook.py@spices でタスクごとのcommand-line option を定義@recipe@spices("-d: debug mode",
commad-line の引数と"-p port: port number")
オプションを受け取る
def start(c, *args, **kwargs):
debug = kwargs.get('d') # True or None
port = kwargs.get("p", 8080)
app = args and args[0] or 'helloworld'
echo(c%"debug=$(debug), port=$(port), app=$(app)")### 実行例: sh> kk start -dp 8080 helloworld
LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved7コマンドフレームワーク
mygit#!/usr/bin/env pykook -X「pykook -X」をshebang に指定

kook_desc = "git helper"@recipedef ci(c):'''invokes git commit'''system("git commit -a")コマンドの説明@recipe
各タスクがサブコマンドに
def co(c):'''invokes git clone'''system(c%"git clone $(url)")
LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved8実行例
サブコマンドの実行

サブコマンド一覧

sh> ./mygit ci[master 773f3ba] comment
1 files changed,
1 insertions(+),
0 deletions(-)

sh> ./mygit -h
mygit - git helper
sub-commands:
ci: invokes git commit
co : invokes git clone

・スクリプト名で起動する（kk や pykook ではないことに注意）
・サブコマンド別のオプションも可能
LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved
9プロパティとプロパティファイル
Kookbook.py
CC = prop("CC", "gcc")
cflags = prop("cflags", "")@recipedef build(c):system(c%"$(CC) $(cflags) hello.c")
Properties.py
cflags = "-g -Wall"

LLTV 2009 Lightning Talk

コマンドラインでも「--cﬂags='...'」で指定可能

copyright© 2009 kuwata-lab.com all rights reserved10定義済みコマンドcp(), cp̲p(), cp̲r(), cp̲pr()system()rm(), rm̲r(), rm̲f(), rm̲rf()echo()

mkdir(), mkdir̲p()

touch()

mv()

cd(), chdir()store() # ディレクトリ構造をwith chdir('build'):system('...')# withを抜けると# 元の場所に自動復帰

保ったままコピーedit() # ファイルを一括変更

LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved
11その他の機能「-n」でコマンドを実行せず表示のみ（dry-run）「-F」で強制実行（タイムスタンプを無視）「-D」でより詳細な情報を表示
タスク定義のループを自動検出

LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved
12続きはWebで！
http://www.kuwata-lab.com/kook/pykook-users-guide.html

LLTV 2009 Lightning Talk

copyright© 2009 kuwata-lab.com all rights reserved
13thank you

14