Respostas:
Documentação dos argumentos da tarefa do Fabric 2:
http://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#task-command-line-arguments
O Fabric 1.X usa a seguinte sintaxe para passar argumentos para tarefas:
fab task:'hello world'
fab task:something='hello'
fab task:foo=99,bar=True
fab task:foo,bar
Você pode ler mais sobre isso nos documentos do Fabric .
hello world
parecem necessárias?
world
era uma nova tarefa.
'hello world'
resultaria em uma string Python de 'hello world'
, mas "hello world"
resultaria em hello world
(que provavelmente é o que a maioria das pessoas gostaria).
bar=True
no comando tecido vai passada como bar='True'
o que não é boolean valor
Os argumentos de malha são entendidos com uma análise de cadeias muito básica, portanto, você deve ter um pouco de cuidado com a forma como os envia.
Aqui estão alguns exemplos de maneiras diferentes de passar argumentos para a seguinte função de teste:
@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'})
Eu uso aspas duplas aqui para tirar o shell da equação, mas aspas simples podem ser melhores para algumas plataformas. Observe também as fugas dos caracteres que a malha considera delimitadores.
Mais detalhes nos documentos: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments
No Fabric 2, basta adicionar o argumento à sua função de tarefa. Por exemplo, para passar o version
argumento para a tarefa deploy
:
@task
def deploy(context, version):
...
Execute-o da seguinte maneira:
fab -H host deploy --version v1.2.3
O Fabric até documenta as opções automaticamente:
$ fab --help deploy
Usage: fab [--core-opts] deploy [--options] [other tasks here ...]
Docstring:
none
Options:
-v STRING, --version=STRING
Você precisa passar todas as variáveis Python como seqüências de caracteres, especialmente se estiver usando o subprocesso para executar os scripts, ou você receberá um erro. Você precisará converter as variáveis novamente para tipos int / booleanos separadamente.
def print_this(var):
print str(var)
fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'
Se alguém estiver procurando passar parâmetros de uma tarefa para outra no fabric2, basta usar o dicionário de ambiente para isso:
@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')
E corra:
fab2 qa sign