Передайте параметр тканинній задачі


123

Як я можу передати параметр тканинній задачі при виклику "fab" з командного рядка? Наприклад:

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

Done.

Чи можна це зробити без підказки fabric.operations.prompt?

Відповіді:


207

Документація з аргументацією задачі 2:

http://docs.pyinvoke.org/en/latest/concepts/invoking-tasks.html#task-command-line-arguments


Тканина 1.X використовує такий синтаксис для передачі аргументів до завдань:

 fab task:'hello world'
 fab task:something='hello'
 fab task:foo=99,bar=True
 fab task:foo,bar

Детальніше про це ви можете прочитати в документах Fabric .


9
Цитати не потрібні; всі аргументи - це рядки: "оскільки цей процес передбачає розбір рядків, всі значення в кінцевому підсумку стануть рядками Python, тому плануйте відповідно. (Ми сподіваємося на покращення цього в майбутніх версіях Fabric, за умови, що інтуїтивний синтаксис можна знайти)"
Карл Г

4
Цитати навколо hello worldздаються необхідними?
ПЕЗ

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

У тканині 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

чи є спосіб визначити хостів у самій функції? Подібно до тегу @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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.