Передать параметр в задачу фабрики

123

Как я могу передать параметр в задачу фабрики при вызове "fab" из командной строки? Например:

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

Done.

Можно ли это сделать без подсказки fabric.operations.prompt?

Donovan
источник

Ответы:

207

Документация по аргументам задачи 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 .

Якуб Розтоцил
источник
9
Цитаты не нужны; все аргументы являются строками: «поскольку этот процесс включает в себя синтаксический анализ строк, все значения будут преобразованы в строки Python, поэтому планируйте соответственно. (Мы надеемся улучшить это в будущих версиях Fabric, при условии, что будет найден интуитивно понятный синтаксис.)»
Carl G
4
Цитаты вокруг hello worldкажутся необходимыми?
PEZ
2
@PEZ Если это правда, кавычки, вероятно, необходимы в этом примере, потому что синтаксический анализатор командной строки терминала или фабрики увидит пробел и подумает, что это конец всего для этой задачи и worldэто новая задача.
Адам Керз
1
Кроме того, после использования этого менее чем за минуту я обнаружил, что в Windows использование одинарных кавычек приводит к тому, что одинарные кавычки передаются как часть аргумента, но сначала удаляются двойные кавычки. Таким образом, 'hello world'в результате будет строка Python 'hello world', но "hello world"в результате hello world(что, вероятно, захотело бы большинство людей).
Адам Керз
5
Поскольку процесс включает в себя синтаксический анализ строки, bar=Trueв ткань будет передана команда, bar='True'которая не является логическим значением
программист-химик
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'})

Здесь я использую двойные кавычки, чтобы исключить оболочку из уравнения, но одинарные кавычки могут быть лучше для некоторых платформ. Также обратите внимание на экраны для символов, которые ткань считает разделителями.

Подробнее в документах: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-arguments.

Богдан Киселица
источник
7

В 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
MRTS
источник
есть ли способ предопределить хосты в самой функции? Подобно тегу @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'
Frage
источник
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
Микель
источник