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




        makoto kuwata <kwa@kuwata-lab.com>

                                             1
pyKook - Python版 Rake
          タスク定義をPythonで記述

          タスク処理を「料理」に例える

              Recipe (タスク定義), Cookbook (定義ファイル),
              Product (生成物), Ingredient (材料), ...

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



LLTV 2009 Lightning Talk            copyright© 2009 kuwata-lab.com all rights reserved
                                                                                         2
タスク定義

                   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
タスクの一覧と実行

   タスクの実行                         タスク一覧の表示
     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
ファイル生成ルール
                           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
内容が変更されたか確認
                                     タイムスタンプだけ更新される
                           hello

                 X
             コンパイル

                                     ファイルの内容に変更なし
                           hello.o
             コンパイル
                                      コメントだけを変更して
                           hello.c     「kk hello」を実行



LLTV 2009 Lightning Talk                  copyright© 2009 kuwata-lab.com all rights reserved
                                                                                               6
タスク別オプション
   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 helloworld
LLTV 2009 Lightning Talk             copyright© 2009 kuwata-lab.com all rights reserved
                                                                                          7
コマンドフレームワーク
      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
実行例
   サブコマンドの実行                    サブコマンド一覧
     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
プロパティとプロパティファイル
      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
定義済みコマンド
       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
その他の機能
          「-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

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

  • 1.
  • 2.
    pyKook - Python版Rake タスク定義をPythonで記述 タスク処理を「料理」に例える Recipe (タスク定義), Cookbook (定義ファイル), Product (生成物), Ingredient (材料), ... http://www.kuwata-lab.com/kook/pykook- users-guide.html LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 2
  • 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.
    タスクの一覧と実行 タスクの実行 タスク一覧の表示 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.
    ファイル生成ルール 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.
    内容が変更されたか確認 タイムスタンプだけ更新される hello X コンパイル ファイルの内容に変更なし hello.o コンパイル コメントだけを変更して hello.c 「kk hello」を実行 LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 6
  • 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 helloworld LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 7
  • 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.
    実行例 サブコマンドの実行 サブコマンド一覧 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.
    プロパティとプロパティファイル 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.
    定義済みコマンド 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.
    その他の機能 「-n」でコマンドを実行せず表示のみ(dry-run) 「-F」で強制実行(タイムスタンプを無視) 「-D」でより詳細な情報を表示 タスク定義のループを自動検出 LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 12
  • 13.
    続きはWebで! http://www.kuwata-lab.com/kook/pykook-users-guide.html LLTV 2009 Lightning Talk copyright© 2009 kuwata-lab.com all rights reserved 13
  • 14.