SlideShare a Scribd company logo
『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

More Related Content

PDF
Lithium Labo #1
PPT
Cakephp勉強会@tokyo #4
PDF
Lisp Tutorial for Pythonista Day 6
PDF
Boost tour 1.60.0 merge
PDF
(工事中) Git の仕組み
PPT
いまさら聞けないRake入門
PDF
明日から使える気になるGo言語による並行処理
PPTX
How to make gem
Lithium Labo #1
Cakephp勉強会@tokyo #4
Lisp Tutorial for Pythonista Day 6
Boost tour 1.60.0 merge
(工事中) Git の仕組み
いまさら聞けないRake入門
明日から使える気になるGo言語による並行処理
How to make gem

What's hot (16)

PDF
Boost Tour 1.48.0 diff
PDF
Boost Tour 1_58_0 merge
PDF
Boost tour 1_40_0
PPTX
Apache Camel Netty component
PDF
Cocoa勉強会#33-意外に楽に使えるlibcurl
PDF
Netty & Apache Camel
PDF
20分で理解するdisplaysystem
PDF
Lagopus 0.2
PDF
Tokyo.R#16 wdkz
PDF
ラボユース最終成果報告会(Web公開版)
PDF
曖昧 RPM 講座
PDF
R を起動するその前に
PDF
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
PDF
2日間Fabricを触った俺が
 色々解説してみる
Boost Tour 1.48.0 diff
Boost Tour 1_58_0 merge
Boost tour 1_40_0
Apache Camel Netty component
Cocoa勉強会#33-意外に楽に使えるlibcurl
Netty & Apache Camel
20分で理解するdisplaysystem
Lagopus 0.2
Tokyo.R#16 wdkz
ラボユース最終成果報告会(Web公開版)
曖昧 RPM 講座
R を起動するその前に
Sqoopコネクタを書いてみた (Hadoopソースコードリーディング第12回 発表資料)
2日間Fabricを触った俺が
 色々解説してみる
Ad

Similar to PythonでRakeもどきを作ってみた (20)

PDF
ソフトウェア工学2023 14 ビルド
PDF
Capistrano
PDF
Dockerfileを改善するためのBest Practice 2019年版
PDF
qmake入門
PDF
研究生のためのC++ no.2
PDF
ocamloptの全体像
PDF
Debianを用いたCortex-M3マイコン開発事例のご紹介
PDF
Ruby&Active Support for expert 3
PDF
lilo.linux.or.jp の話 (2017年8月)
KEY
ひのきのぼうだけで全クリ目指す
PPTX
第一回コンテナ情報交換会@関西
PDF
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
PDF
Building production server on docker
ODP
Building production server on docker
PDF
Go言語によるwebアプリの作り方
KEY
Fabricでサーバー管理をDRYにしよう
PPTX
Perl/CGI 入門
PDF
PostgreSQL - C言語によるユーザ定義関数の作り方
PDF
How to run P4 BMv2
PDF
Openstack chef-repo
ソフトウェア工学2023 14 ビルド
Capistrano
Dockerfileを改善するためのBest Practice 2019年版
qmake入門
研究生のためのC++ no.2
ocamloptの全体像
Debianを用いたCortex-M3マイコン開発事例のご紹介
Ruby&Active Support for expert 3
lilo.linux.or.jp の話 (2017年8月)
ひのきのぼうだけで全クリ目指す
第一回コンテナ情報交換会@関西
Docker on RHEL & Project Atomic 入門 - #Dockerjp 4
Building production server on docker
Building production server on docker
Go言語によるwebアプリの作り方
Fabricでサーバー管理をDRYにしよう
Perl/CGI 入門
PostgreSQL - C言語によるユーザ定義関数の作り方
How to run P4 BMv2
Openstack chef-repo
Ad

More from kwatch (20)

PDF
How to make the fastest Router in Python
PDF
Migr8.rb チュートリアル
PDF
なんでもID
PDF
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
PDF
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
PDF
O/Rマッパーによるトラブルを未然に防ぐ
PDF
正規表現リテラルは本当に必要なのか?
PDF
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
PDF
DBスキーマもバージョン管理したい!
PDF
PHPとJavaScriptにおけるオブジェクト指向を比較する
PDF
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
PDF
Fantastic DSL in Python
PDF
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
PDF
PHP5.5新機能「ジェネレータ」初心者入門
PDF
Pretty Good Branch Strategy for Git/Mercurial
PDF
Oktest - a new style testing library for Python -
PDF
文字列結合のベンチマークをいろんな処理系でやってみた
PDF
I have something to say about the buzz word "From Java to Ruby"
PDF
Cより速いRubyプログラム
PDF
Javaより速いLL用テンプレートエンジン
How to make the fastest Router in Python
Migr8.rb チュートリアル
なんでもID
Nippondanji氏に怒られても仕方ない、配列型とJSON型の使い方
【SQLインジェクション対策】徳丸先生に怒られない、動的SQLの安全な組み立て方
O/Rマッパーによるトラブルを未然に防ぐ
正規表現リテラルは本当に必要なのか?
【公開終了】Python4PHPer - PHPユーザのためのPython入門 (Python2.5)
DBスキーマもバージョン管理したい!
PHPとJavaScriptにおけるオブジェクト指向を比較する
SQL上級者こそ知って欲しい、なぜO/Rマッパーが重要か?
Fantastic DSL in Python
What is wrong on Test::More? / Test::Moreが抱える問題点とその解決策
PHP5.5新機能「ジェネレータ」初心者入門
Pretty Good Branch Strategy for Git/Mercurial
Oktest - a new style testing library for Python -
文字列結合のベンチマークをいろんな処理系でやってみた
I have something to say about the buzz word "From Java to Ruby"
Cより速いRubyプログラム
Javaより速いLL用テンプレートエンジン

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

  • 1. 『PythonでRakeもどきを作ってみた』 makoto kuwata <kwa@kuwata-lab.com> 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. thank you 14