僕とコードとブルーハワイ

omega (@equal_001) の日記

pyinvoke を触ってみた

pyinvoke

Welcome to Invoke! — Invoke documentation
pyinvokeは、いろんなコマンドをまるっと纏めることができるモジュール。
たとえば、開発で頻繁に必要となるコマンドを一つに集約させる場合にこのpyinvokeが生きてくる。
いま仕事でDjangoコマンド、テスト実行コマンド、環境毎の実行コマンドなどをpyinvokeでまとめているけどinvokeさえ覚えればいいのでとても楽。

今回の実行環境

OS Pythonバージョン invokeバージョン
MacOSX Yosemite 10.10.3 3.4.3 0.10.1(2016/03/30現在最新)

インストール

$ 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!  # 追記されている