pyinvoke を触ってみた
pyinvoke
Welcome to Invoke! — Invoke documentation
pyinvokeは、いろんなコマンドをまるっと纏めることができるモジュール。
たとえば、開発で頻繁に必要となるコマンドを一つに集約させる場合にこのpyinvokeが生きてくる。
いま仕事でDjangoコマンド、テスト実行コマンド、環境毎の実行コマンドなどをpyinvokeでまとめているけどinvokeさえ覚えればいいのでとても楽。
インストール
$ pip install invoke
使い方
Getting started — Invoke documentation に使用方法が書かれています。
基本は、tasks.pyに@taskを関数の上に宣言して実行させたい内容を関数内に記述するだけ。
また、関数Aの@task()の引数に関数Bを渡すと、関数Aを実行する前に関数Bが実行される(pre-taskの設定)。
試しに、invokeコマンドから「demo/demo.txtに任意の文字列を追記する」「demoディレクトリを削除」という2つのタスクを追加する。
tasks.py
import os from invoke import task, run @task def mkdir_demo(): """demoディレクトリがなかったら作成 """ if not os.path.exists("demo/"): os.mkdir("demo") @task(mkdir_demo) def add_text(line): """demo.txtに任意の文字列を追記する """ run("echo {} >> demo/demo.txt".format(line)) @task def reset(): """demo/をまるっと削除 """ run("rm -r demo/")
invoke --listすると、追加したコマンドの一覧を表示できる。このとき、docstringが各コマンドの説明として出てくる。
ただ、pre-taskもこのリストに表示されるのが微妙。
$ invoke --list
Available tasks:
add_text demo.txtに任意の文字列を追記する
mkdir_demo demoディレクトリがなかったら作成
reset demo/をまるっと削除
実際にコマンドを実行してみる。
$ ls demo/ ls: demo/: No such file or directory # demoディレクトリが存在しないことを確認 $ invoke add_text hello $ cat demo/demo.txt hello # demoディレクトリが作成され、demo.txtに指定した文字列"hello"が追記されている $ invoke add_text world! $ cat demo/demo.txt hello world! # 追記されている