Welcome to Invoke!

Invokeはpython製のタスクランナーです.

Pythonでタスクを書くので, pythonが使える人にはストレスレスだと思います.

よく使っている/使っていた機能を書いてみます.

このブログの内容は 適宜更新していきます.

基本的な使い方

まずはinvokeのインストール

$ pip install invoke

まずは一番簡単な例. 以下をtasks.pyに書きます.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from invoke import task


@task
def hello(ctx, to_='Invoke'):
    print(f"Hello {to_}!")

すると

$ inv hello
Hello Invoke!

となります.

プレタスク

task@taskが付いている関数を渡すと その関数を直前に実行します:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from invoke import task


@task
def hello(ctx):
    print("Hello Invoke!")


@task(hello)
def hello2(ctx):
    print("Hello2 Invoke!")
$ inv hello2
Hello Invoke!
Hello2 Invoke!

変数の渡し方

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from invoke import task


@task
def hello(ctx, you="Aiya"):
    print("Hello Yassu!")
    print(f"Hello {you}!")
$ inv hello
Hello Yassu!
Hello Aiya!
$ inv hello --you Blacky
Hello Yassu!
Hello Blacky!
$ inv hello -y Blacky
Hello Yassu!
Hello Blacky!

デフォルト値にTrueもしくはFalseを渡すと bool値を渡すことができます:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from invoke import task


@task
def hello(ctx, show_me=True):
    if show_me:
        print(f"Hello Yassu!")
    print(f"Hello Aiya!")
$ inv hello
Hello Yassu!
$ inv hello --show-me
Hello Yassu!
Hello Aiya!
$ inv hello --no-show-me
Hello Aiya!

ワン・コマンドで複数のタスクを実行する

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from invoke import task


@task
def hello(ctx):
    print(f"Hello Yassu!")


@task
def hello2(ctx):
    print(f"Hello Aiya!")
$ inv hello hello2
Hello Yassu!
Hello Aiya!

コンテキストの使い方

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from invoke import task


@task
def hello(ctx):
    with ctx.cd("/usr/"):
        ctx.run("ls")

    print()

    ctx.sudo("whoami")
$ inv hello
X11
X11R6
bin
lib
libexec
local
sbin
share
standalone

root

ctx.run, ctx.sudoでコマンドの実行ができます. また, ctx.cdでパスの移動ができます.

ヘルプの書き方

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from invoke import task


@task(help={"me": "my name", "you": "you name", "show-me": "show me or not"})
def hello(ctx, me, you="Aiya", show_me=True):
    """
    show hello
    hello is greeting
    """
    if show_me:
        print(f"Hello {me}!")
    print(f"Hello {you}!")

inv -lで 実行可能なタスク一覧を取得することができます.

$ inv -l
Available tasks:

  hello   show hello

また, inv --help {task-name}もしくは inv -h {task-name}でタスクのヘルプを取得することができます:

$ inv --help hello
Usage: inv[oke] [--core-opts] hello [--options] [other tasks here ...]

Docstring:
  show hello
  hello is greeting

Options:
  -m STRING, --me=STRING    my name
  -s, --[no-]show-me        show me or not
  -y STRING, --you=STRING   you name