Відповіді:
Документація з аргументацією задачі 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 .
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
У тканині 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
Вам потрібно передавати всі змінні 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