Câu trả lời:
Tài liệu đối số kết cấu 2 tác vụ:
http://docs.pyinvoke.org/en/latest/con accept / invoking-t task.html # task-command-line-extument
Fabric 1.X sử dụng cú pháp sau để truyền đối số cho các tác vụ:
fab task:'hello world'
fab task:something='hello'
fab task:foo=99,bar=True
fab task:foo,bar
Bạn có thể đọc thêm về nó trong tài liệu Fabric .
hello world
có vẻ cần thiết mặc dù?
world
là một nhiệm vụ mới.
'hello world'
sẽ dẫn đến một chuỗi Python 'hello world'
, nhưng "hello world"
sẽ dẫn đến hello world
(đó có lẽ là điều mà hầu hết mọi người sẽ muốn).
bar=True
trong lệnh vải sẽ được chuyển qua vì bar='True'
không phải là giá trị boolean
Đối số kết cấu được hiểu với phân tích chuỗi rất cơ bản, vì vậy bạn phải cẩn thận một chút với cách bạn gửi chúng.
Dưới đây là một vài ví dụ về các cách khác nhau để truyền đối số cho hàm kiểm tra sau:
@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'})
Tôi sử dụng trích dẫn kép ở đây để đưa vỏ ra khỏi phương trình, nhưng trích dẫn đơn có thể tốt hơn cho một số nền tảng. Cũng lưu ý các lối thoát cho các ký tự mà vải xem xét các dấu phân cách.
Thêm chi tiết trong các tài liệu: http://docs.fabfile.org/en/1.14/usage/fab.html#per-task-argument
Trong Fabric 2, chỉ cần thêm đối số vào hàm nhiệm vụ của bạn. Ví dụ: để truyền version
đối số cho tác vụ deploy
:
@task
def deploy(context, version):
...
Chạy nó như sau:
fab -H host deploy --version v1.2.3
Vải thậm chí tài liệu các tùy chọn tự động:
$ fab --help deploy
Usage: fab [--core-opts] deploy [--options] [other tasks here ...]
Docstring:
none
Options:
-v STRING, --version=STRING
Bạn cần truyền tất cả các biến Python dưới dạng chuỗi, đặc biệt nếu bạn đang sử dụng quy trình phụ để chạy các tập lệnh, nếu không bạn sẽ gặp lỗi. Bạn sẽ cần phải chuyển đổi các biến trở lại các kiểu int / boolean một cách riêng biệt.
def print_this(var):
print str(var)
fab print_this:'hello world'
fab print_this='hello'
fab print_this:'99'
fab print_this='True'
Nếu ai đó đang tìm cách truyền tham số từ tác vụ này sang tác vụ khác trong Fabric2, chỉ cần sử dụng từ điển môi trường cho điều đó:
@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')
Và chạy:
fab2 qa sign