将参数传递给结构任务


123

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

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

Done.

是否可以在没有提示的情况下执行此操作fabric.operations.prompt

Answers:


207

Fabric 2任务参数文档:

http://docs.pyinvoke.org/zh_CN/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字符串,所以相应的计划(我们希望在这个以改善织物的未来版本,提供了一个直观的语法都可以找到。)。”
Carl G

4
周围的引号hello world似乎有必要吗?
PEZ 2015年

2
@PEZ如果是这样,则在该示例中可能需要使用引号,因为终端或结构的命令行解析器将看到该空间,并认为这是该任务的所有内容的结尾,并且world是一个新任务。
亚当·凯兹

1
此外,在使用此命令不到一分钟之后,我发现在Windows上,使用单引号会导致单引号作为参数的一部分传递,但首先会删除双引号。因此,'hello world'将导致Python字符串为'hello world',但"hello world"将导致hello world(这可能是大多数人想要的)。
亚当·凯兹

5
由于该过程涉及字符串解析,因此bar=True将传递fabric命令,因为bar='True'它不是布尔值
Chemical Programmer

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

我在这里使用双引号将外壳排除在等式之外,但对于某些平台,单引号可能更好。还要注意Fabric认为是定界符的字符的转义符。

docs中有更多详细信息:http : //docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments


7

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

有没有办法在函数本身中预定义主机?与@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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.