web-dev-qa-db-ja.com

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

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

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

Done.

fabric.operations.Promptでプロンプトを表示せずにこれを行うことは可能ですか?

121
Donovan

ファブリック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 docs をご覧ください。

204
Jakub

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

以下は、次のテスト関数に引数を渡すさまざまな方法の例です。

@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

4

Fabric 2では、タスク関数に引数を追加するだけです。たとえば、version引数をタスクdeployに渡すには:

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

次のように実行します。

fab -H Host deploy --version v1.2.3

Fabricはオプションを自動的に文書化します:

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

Docstring:
  none

Options:
  -v STRING, --version=STRING
3
mrts

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

def print_this(var):
    print str(var)

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

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

@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
1
MikeL