デコレーター

fabfileで使われる便利なデコレーター。

fabric.decorators.hosts(*host_list)

ラップされた関数をひとつもしくは複数のどのホストに対して実行するのかを定義しているデコレーターです。

例えば、以下はコマンドラインへの上書きを防ぎます。my_funchost1host2host3 に対して、そして host1``と``host3 に対してはユーザーを指定して実行されます。

@hosts('user1@host1', 'host2', 'user2@host3')
def my_func():
    pass

hosts は引き数リスト(@hosts('host1'), @hosts('host1', 'host2'))もしくは繰り返しの引き数(@hosts(['host1', 'host2']))を取って実行できます。

このデコレーターは実際には単にその関数の .hosts 属性をセットするだけです。そのため、その関数の実行に先立って読み込まれます。

バージョン 0.9.2 で変更: @hosts(*iterable) を必要とする代わりに繰り返しの引き数 (@hosts(iterable)) として利用できるようになりました。

fabric.decorators.parallel(pool_size=None)

これでラップされた関数が常に並列に実行されるよう、決して順番には実行されないようにします。

このデコレーターは env.parallel のグローバル値よりも優先します。また、serial と両方を持つタスクでは serial よりも優先します。

バージョン 1.3 で追加.

fabric.decorators.roles(*role_list)

ホストリストを参照するために利用されるロール名のリストを定義するデコレーターです。

ロールは、一つもしくは複数のホスト接続文字列を値とする env のキーとして単純に定義されます。例えば次の例は、コマンドラインに対する上書きを防ぎ、my_funcwebserverdbserver のロールにリストされているホストに対して実行されます。

env.roledefs.update({
    'webserver': ['www1', 'www2'],
    'dbserver': ['db1']
})

@roles('webserver', 'dbserver')
def my_func():
    pass

hosts と同じように roles は引き数リストもしくは単一の繰り返しの引き数を取って実行できます。同じように、このデコレーターは hosts と同じ仕組みを使い、単純に <function>.roles をセットします。

バージョン 0.9.2 で変更: 単一の繰り返しの引き数(hosts と同じように)が使えるようになりました。

fabric.decorators.runs_once(func)

ラップされた関数が複数回実行されないようにするデコレーターです。

内部の状態を保持することによって、このデコレーターは関数に印をつけ、一つのPython繰り返しセッションにつき一度だけしか実行できないようにします。典型的な使用法としてはつまり、”その fab プログラムの実行につき一回” ということです。

このデコレーターでラップされたどんな関数でも、それが2回め、3回め、n回目に呼び出されて呼び出されたときに何もせずに実行に失敗し、最初のオリジナルの実行の値を返します。

ノート

runs_once は並列タスク実行では動作しません。

fabric.decorators.serial(func)

これでラップされた関数が常に順番に実行されるよう、決して並列には実行されないようにします。

このデコレーターは env.parallel のグローバル値よりも優先します。とは言え、serialparallel両方 のデコレーターを持つタスクでは parallel が優先します。

バージョン 1.3 で追加.

fabric.decorators.task(*args, **kwargs)

ラップされた関数が新しいスタイルのタスクであることを宣言するデコレーターです。

単純な引数なしのデコレーターとして、もしくは挙動をカスタマイズする引き数 (e.g. @task(alias='myalias')) を伴って実行されます。

このデコレーターの利用法の詳細は new-style task をご覧ください。

バージョン 1.2 で変更: aliasaliasestask_classdefault のキーワード引き数を追加しました。詳細は 引数 をご覧ください。

バージョン 1.5 で変更: name キーワード引き数を追加しました。

fabric.decorators.with_settings(*arg_settings, **kw_settings)

fabric.context_managers.settings と同等のデコレーターです。

まるで settings コンテキストマネージャーを伴ってひとつのブロック内で呼び出されたように関数全体をラップします。これは、関数ボディ全体に与えられたセッティングを適用させたいときや、すべてをインデントさせずに古いコードを変更したいときに便利です。

例えば、タスク関数全体で停止を警告に変更します:

@with_settings(warn_only=True)
def foo():
    ...

参考

settings

バージョン 1.1 で追加.