如何从命令行调用“fab”时将参数传递给结构任务?例如:
def task(something=''):
print "You said %s" % something
$ fab task "hello"
You said hello
Done.
是否可以在不提示fabric.operations.prompt
的情况下执行此操作?
答案 0 :(得分:202)
Fabric 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中了解更多相关信息。
答案 1 :(得分:3)
结构参数是通过非常基本的字符串解析来理解的,因此您在发送它们时必须要小心一点。
以下是将参数传递给以下测试函数的几种不同方式的示例:
@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
答案 2 :(得分: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'
答案 3 :(得分: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
答案 4 :(得分:0)
在结构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