パラメータをファブリックタスクに渡す


123

コマンドラインから「fab」を呼び出すときに、ファブリックタスクにパラメーターを渡すにはどうすればよいですか?例えば:

def task(something=''):
    print "You said %s" % something
$ fab task "hello"
You said hello

Done.

プロンプトなしでこれを行うことは可能fabric.operations.promptですか?

回答:


207

ファブリック2タスク引数のドキュメント:

http://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#task-command-line-arguments


Fabric 1.Xは、タスクに引数を渡すために次の構文を使用します。

 fab task:'hello world'
 fab task:something='hello'
 fab task:foo=99,bar=True
 fab task:foo,bar

詳細については、Fabricのドキュメントをご覧ください。


9
引用符は必要ありません。すべての引数は文字列です。「このプロセスは、文字列解析を伴うため、すべての値がPythonの文字列としてなってしまいますので、それに応じ計画(私たちは、直感的な構文を見つけることができます提供し、ファブリックの将来のバージョンでこれを改善したいと考えています。)。」
カールG

4
周りの引用hello worldは必要だと思われますか?
PEZ、2015

2
@PEZそれが本当である場合、端末またはファブリックのコマンドラインパーサーがスペースを見て、それがそのタスクのすべての終わりであり、それworldが新しいタスクであると考えるので、引用符はおそらくその例で必要です。
Adam Kerz

1
さらに、これを1分未満使用した後、Windowsで単一引用符を使用すると、単一引用符が引数の一部として渡されますが、二重引用符が最初に削除されることがわかりました。したがって、'hello world'Pythonの文字列は'hello world'になりますが、"hello world"結果はhello world(おそらくほとんどの人が望むものです)になります。
Adam Kerz

5
プロセスには文字列の解析が含まれるため、bar=Truein bar='True'boolean値ではないファブリックコマンドが渡されます
ケミカルプログラマー

7

ファブリックの引数は非常に基本的な文字列解析で理解されるため、それらの送信方法には少し注意する必要があります。

次のテスト関数に引数を渡すさまざまな方法の例をいくつか示します。

@task
def test(*args, **kwargs):
    print("args:", args)
    print("named args:", kwargs)

$ fab "test:hello world"
('args:', ('hello world',))
('named args:', {})

$ fab "test:hello,world"
('args:', ('hello', 'world'))
('named args:', {})

$ fab "test:message=hello world"
('args:', ())
('named args:', {'message': 'hello world'})

$ fab "test:message=message \= hello\, world"
('args:', ())
('named args:', {'message': 'message = hello, world'})

ここでは二重引用符を使用してシェルを方程式から外していますが、プラットフォームによっては単一引用符の方が適している場合があります。また、ファブリックが区切り文字と見なす文字のエスケープにも注意してください。

ドキュメントの詳細:http : //docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments


7

ファブリック2では、タスク関数に引数を追加するだけです。たとえば、version引数をtask に渡すにはdeploy

@task
def deploy(context, version):
    ...

次のように実行します。

fab -H host deploy --version v1.2.3

ファブリックはオプションを自動的に文書化します:

$ fab --help deploy
Usage: fab [--core-opts] deploy [--options] [other tasks here ...]

Docstring:
  none

Options:
  -v STRING, --version=STRING

関数自体にホストを事前定義する方法はありますか?タスクを実行するホストのリストを定義できる@roles()タグに似ています。
アニッシュ

2

特にサブプロセスを使用してスクリプトを実行している場合は、すべてのPython変数を文字列として渡す必要があります。そうしないと、エラーが発生します。変数を個別にint / boolean型に戻す必要があります。

def print_this(var):
    print str(var)

fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'

1

誰かがfabric2のあるタスクから別のタスクにパラメーターを渡そうとしている場合は、そのために環境ディクショナリを使用します。

@task
def qa(ctx):
  ctx.config.run.env['counter'] = 22
  ctx.config.run.env['conn'] = Connection('qa_host')

@task
def sign(ctx):
  print(ctx.config.run.env['counter'])
  conn = ctx.config.run.env['conn']
  conn.run('touch mike_was_here.txt')

そして実行します:

fab2 qa sign
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.