Truyền tham số cho tác vụ vải


123

Làm cách nào tôi có thể truyền tham số cho tác vụ kết cấu khi gọi "fab" từ dòng lệnh? Ví dụ:

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

Done.

Có thể làm điều này mà không cần nhắc nhở fabric.operations.prompt?

Câu trả lời:


207

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 .


9
Các trích dẫn không cần thiết; tất cả các đối số là các chuỗi: "vì quá trình này liên quan đến phân tích chuỗi, tất cả các giá trị sẽ kết thúc dưới dạng chuỗi Python, vì vậy hãy lên kế hoạch cho phù hợp. (Chúng tôi hy vọng sẽ cải thiện điều này trong các phiên bản tương lai của Fabric, với điều kiện có thể tìm thấy cú pháp trực quan."
Carl G

4
Các trích dẫn xung quanh hello worldcó vẻ cần thiết mặc dù?
PEZ

2
@PEZ Nếu đó là sự thật, các trích dẫn có thể là cần thiết trong ví dụ đó bởi vì trình phân tích cú pháp dòng lệnh của thiết bị đầu cuối hoặc vải sẽ nhìn thấy khoảng trống và nghĩ rằng đó là kết thúc của mọi thứ cho nhiệm vụ đó và đó worldlà một nhiệm vụ mới.
Adam Kerz

1
Ngoài ra, sau khi sử dụng điều này trong chưa đầy một phút, tôi đã thấy rằng, trên Windows, sử dụng các trích dẫn đơn dẫn đến các trích dẫn đơn được truyền như một phần của đối số, nhưng dấu ngoặc kép được loại bỏ trước tiên. Vì vậy, '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).
Adam Kerz

5
Vì quá trình này liên quan đến phân tích chuỗi, bar=Truetrong lệnh vải sẽ được chuyển qua vì bar='True'không phải là giá trị boolean
Lập trình viên hóa học

7

Đố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


7

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

Có cách nào để xác định trước các máy chủ trong chính chức năng không? Tương tự như thẻ @roles () nơi chúng ta có thể xác định danh sách các máy chủ để chạy tác vụ.
Anish

2

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'

1

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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.