将参数传递给织物任务

当从命令行调用“ fab”时,如何将参数传递给结构任务? 例如:

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


Done.

有没有可能做到这一点,而不提示与 fabric.operations.prompt

52377 次浏览

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

你可以在 布料文件中了解更多。

您需要将所有 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'

Fabric 1.x 参数可以通过非常基本的字符串解析来理解,因此您必须小心地发送它们。

下面是一些将参数传递给以下测试函数的不同方法的示例:

@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'})

我在这里使用双引号是为了避免使用 shell,但是对于某些平台来说,单引号可能更好。还要注意结构作为分隔符的字符的转义符。

更多详情请参阅文件: Http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments

如果有人想要在 Fabric 中将参数从一个任务传递到另一个任务,只需要使用环境字典:

@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

在 Fabric 2中,只需将参数添加到任务函数中。例如,要将 version参数传递给任务 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