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

2,117 views
2,036 views

Published on

pyKook is a software build tool similar to Rake, Make, Ant, SCons, or Cook. You can define your task in Python. In addition, pyKook has some interesting features.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,117
On SlideShare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

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

  1. 1. 『PythonでRakeもどきを作ってみた』 makoto kuwata <kwa@kuwata-lab.com> 1
  2. 2. pyKook - Python版 Rake タスク定義をPythonで記述 タスク処理を「料理」に例える Recipe (タスク定義), Cookbook (定義ファイル), Product (生成物), Ingredient (材料), ... http://www.kuwata-lab.com/kook/pykook- users-guide.htmlLLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 2
  3. 3. タスク定義 Kookbook.py @recipe をつけると タスク定義に @recipe def clean(c): 関数ドキュメントが remove *.o files タスクの摘要に rm_rf("**/*.o") コマンドでは 「**/」が利用可能LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 3
  4. 4. タスクの一覧と実行 タスクの実行 タスク一覧の表示 sh> kk clean sh> kk -l ### * clean (recipe=clean) Properties: $ rm -rf **/*.o Task recipes: clean : remove *.o ・kk または pykook で起動 ・-l または -L で一覧表示 File recipes:LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 4
  5. 5. ファイル生成ルール Kookbook.py @product() に もしファイルが パターンを指定 @recipe 存在するなら @product(*.o) @ingreds($(1).c, if_exists($(1).h)) @ingreds() で 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
  6. 6. 内容が変更されたか確認 タイムスタンプだけ更新される hello X コンパイル ファイルの内容に変更なし hello.o コンパイル コメントだけを変更して hello.c 「kk hello」を実行LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 6
  7. 7. タスク別オプション Kookbook.py @spices でタスクごとの @recipe command-line option を定義 @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 helloworldLLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 7
  8. 8. コマンドフレームワーク mygit 「pykook -X」を #!/usr/bin/env pykook -X shebang に指定 kook_desc = "git helper" コマンドの説明 @recipe def 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 reserved 8
  9. 9. 実行例 サブコマンドの実行 サブコマンド一覧 sh> ./mygit ci sh> ./mygit -h [master 773f3ba] comment mygit - git helper 1 files changed, 1 insertions(+), 0 deletions(-) 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
  10. 10. プロパティとプロパティファイル Kookbook.py CC = prop("CC", "gcc") cflags = prop("cflags", "") @recipe def build(c): system(c%"$(CC) $(cflags) hello.c") Properties.py コマンドラインでも cflags = "-g -Wall" 「--cflags=...」で指定可能LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 10
  11. 11. 定義済みコマンド 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(...) edit() # ファイルを一括変更 # withを抜けると # 元の場所に自動復帰LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 11
  12. 12. その他の機能 「-n」でコマンドを実行せず表示のみ(dry-run) 「-F」で強制実行(タイムスタンプを無視) 「-D」でより詳細な情報を表示 タスク定義のループを自動検出LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 12
  13. 13. 続きはWebで! http://www.kuwata-lab.com/kook/pykook-users-guide.htmlLLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 13
  14. 14. thank you 14

×