Ответы:
Документация по аргументам задачи 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 .
hello world
кажутся необходимыми?
world
это новая задача.
'hello world'
в результате будет строка Python 'hello world'
, но "hello world"
в результате hello world
(что, вероятно, захотело бы большинство людей).
bar=True
в ткань будет передана команда, bar='True'
которая не является логическим значением
Аргументы ткани понимаются с помощью очень простого синтаксического анализа строк, поэтому вы должны быть немного осторожны с тем, как вы их отправляете.
Вот несколько примеров различных способов передачи аргументов следующей тестовой функции:
@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.
В 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
Вам необходимо передать все переменные 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'
Если кто-то хочет передать параметры от одной задачи к другой в 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