Thường thì một thao tác sẽ yêu cầu một dòng lệnh lớn chứa các giá trị tích luỹ từ các phần phụ thuộc bắc cầu. Ví dụ: dòng lệnh của trình liên kết có thể liệt kê mọi tệp đối tượng mà tất cả các thư viện được liên kết cần. Phương pháp hay nhất là lưu trữ dữ liệu tạm thời như vậy trong depset để nhiều mục tiêu có thể dùng chung. Tuy nhiên, nếu tác giả quy tắc phải chuyển đổi các depsets này thành danh sách chuỗi để tạo dòng lệnh hành động, thì việc này sẽ làm mất đi hiệu quả của việc tối ưu hoá tính năng chia sẻ bộ nhớ này.
Vì lý do này, các hàm tạo thao tác chấp nhận các đối tượng Args ngoài các chuỗi. Mỗi đối tượng Args đại diện cho một chuỗi và depsets được nối, với các phép biến đổi không bắt buộc để thao tác dữ liệu. Các đối tượng Args không xử lý các depsets mà chúng đóng gói cho đến giai đoạn thực thi, khi đến thời điểm tính toán dòng lệnh. Điều này giúp trì hoãn mọi hoạt động sao chép tốn kém cho đến khi giai đoạn phân tích hoàn tất. Hãy xem trang Tối ưu hoá hiệu suất để biết thêm thông tin.
Args được tạo bằng cách gọi ctx.actions.args(). Bạn có thể truyền các tham số này dưới dạng tham số arguments của ctx.actions.run() hoặc ctx.actions.run_shell(). Mỗi đột biến của một đối tượng Args sẽ nối các giá trị vào dòng lệnh cuối cùng.
Tính năng map_each cho phép bạn tuỳ chỉnh cách các mục được chuyển đổi thành chuỗi. Nếu bạn không cung cấp hàm map_each, thì quá trình chuyển đổi tiêu chuẩn sẽ diễn ra như sau:
- Các giá trị đã là chuỗi sẽ được giữ nguyên.
- Các đối tượng
Fileđược chuyển thành giá trịFile.path. - Các đối tượng
Labelđược chuyển thành một chuỗi đại diện sẽ phân giải trở lại cùng một đối tượng khi được phân giải trong ngữ cảnh của kho lưu trữ chính. Nếu có thể, biểu thị chuỗi sẽ sử dụng tên hiển thị của một kho lưu trữ thay vì tên chuẩn của kho lưu trữ. Điều này giúp biểu thị phù hợp để sử dụng trong các tệp BUILD. Mặc dù không đảm bảo hình thức biểu thị chính xác, nhưng các ví dụ điển hình là//foo:bar,@repo//foo:barvà@@canonical_name+//foo:bar.bzl. - Tất cả các loại khác đều được chuyển thành chuỗi theo cách không xác định. Vì lý do này, bạn nên tránh truyền các giá trị không thuộc loại chuỗi hoặc
Fileđếnadd()và nếu truyền các giá trị đó đếnadd_all()hoặcadd_joined()thì bạn nên cung cấp một hàmmap_each.
Khi sử dụng tính năng định dạng chuỗi (các tham số format, format_each và format_joined của phương thức add*()), mẫu định dạng sẽ được diễn giải theo cách tương tự như tính năng thay thế % trên các chuỗi, ngoại trừ việc mẫu phải có chính xác một phần giữ chỗ thay thế và đó phải là %s. Bạn có thể thoát các giá trị phần trăm theo nghĩa đen dưới dạng %%. Định dạng được áp dụng sau khi giá trị được chuyển đổi thành một chuỗi theo nội dung trên.
Mỗi phương thức add*() đều có một dạng thay thế chấp nhận một tham số vị trí bổ sung, một chuỗi "tên đối số" để chèn trước phần còn lại của các đối số. Đối với add_all và add_joined, chuỗi bổ sung sẽ không được thêm nếu chuỗi hoá ra là trống. Ví dụ: cùng một cách sử dụng có thể thêm --foo val1 val2 val3 --bar hoặc chỉ --bar vào dòng lệnh, tuỳ thuộc vào việc chuỗi đã cho có chứa val1..val3 hay không.
Nếu kích thước của dòng lệnh có thể lớn hơn kích thước tối đa mà hệ thống cho phép, thì các đối số có thể được chuyển sang tệp tham số. Hãy xem use_param_file() và set_param_file_format().
Ví dụ: Giả sử chúng ta muốn tạo dòng lệnh:
--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz
Args sau:
# foo_deps and bar_deps are depsets containing
# File objects for the foo and bar .txt files.
args = ctx.actions.args()
args.add_all("--foo", foo_deps)
args.add_joined("--bar", bar_deps, join_with=",")
args.add("--baz")
ctx.actions.run(
...
arguments = [args],
...
)
Hội viên
thêm
Args Args.add(arg_name_or_value, value=unbound, *, format=None)
Thông số
| Thông số | Mô tả |
|---|---|
arg_name_or_value
|
required Nếu bạn truyền 2 tham số vị trí, thì tham số này sẽ được diễn giải là tên đối số. Tên đối số được thêm trước giá trị mà không cần xử lý. Nếu chỉ có một tham số vị trí được truyền, thì tham số đó sẽ được diễn giải là value (xem bên dưới).
|
value
|
mặc định là unboundĐối tượng cần thêm. Giá trị này sẽ được chuyển đổi thành một chuỗi bằng cách sử dụng quy trình chuyển đổi tiêu chuẩn như đã đề cập ở trên. Vì không có tham số map_each cho hàm này, nên value phải là một chuỗi hoặc File. Bạn phải truyền danh sách, bộ giá trị, depset hoặc thư mục File đến add_all() hoặc add_joined() thay vì phương thức này.
|
format
|
chuỗi; hoặc None;
mặc định là NoneMột mẫu chuỗi định dạng, được áp dụng cho phiên bản chuỗi của value.
|
add_all
Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False)
Hầu hết quá trình xử lý diễn ra trên danh sách các đối số cần được nối, theo các bước sau:
- Mỗi mục
Filetrong thư mục sẽ được thay thế bằng tất cả cácFileđược chứa đệ quy trong thư mục đó. - Nếu bạn cung cấp
map_each, thì tham số này sẽ được áp dụng cho từng mục và các danh sách chuỗi kết quả sẽ được nối để tạo thành danh sách đối số ban đầu. Nếu không, danh sách đối số ban đầu là kết quả của việc áp dụng quy trình chuyển đổi tiêu chuẩn cho từng mục. - Mỗi đối số trong danh sách được định dạng bằng
format_each(nếu có). - Nếu
uniquifylà true, các đối số trùng lặp sẽ bị xoá. Lần xuất hiện đầu tiên là lần xuất hiện còn lại. - Nếu bạn cung cấp một chuỗi
before_each, chuỗi đó sẽ được chèn dưới dạng một đối số mới trước mỗi đối số hiện có trong danh sách. Điều này sẽ tăng gấp đôi số lượng đối số cần được thêm vào tại thời điểm này. - Ngoại trừ trường hợp danh sách trống và
omit_if_emptylà true (mặc định), tên arg vàterminate_withsẽ được chèn lần lượt làm đối số đầu tiên và cuối cùng nếu được cung cấp.
Thông số
| Thông số | Mô tả |
|---|---|
arg_name_or_values
|
required Nếu bạn truyền 2 tham số vị trí, thì tham số này sẽ được diễn giải là tên đối số. Tên arg được thêm trước values dưới dạng một đối số riêng biệt mà không cần xử lý. Tên đối số này sẽ không được thêm nếu omit_if_empty là true (mặc định) và không có mục nào khác được thêm vào (như trường hợp nếu values trống hoặc tất cả các mục của nó đều được lọc). Nếu chỉ có một tham số vị trí được truyền, thì tham số đó sẽ được diễn giải là values (xem bên dưới).
|
values
|
sequence; hoặc depset;
mặc định là unboundDanh sách, bộ hoặc depset có các mục sẽ được thêm vào. |
map_each
|
có thể gọi; hoặc None;
mặc định là NoneMột hàm chuyển đổi từng mục thành không hoặc nhiều chuỗi. Các chuỗi này có thể được xử lý thêm trước khi nối. Nếu bạn không cung cấp thông số này, thì lượt chuyển đổi tiêu chuẩn sẽ được sử dụng. Hàm này được truyền một hoặc hai đối số vị trí: mục cần chuyển đổi, theo sau là Loại giá trị trả về phụ thuộc vào số lượng đối số cần tạo cho mục:
None duy nhất có tác dụng tương tự như việc trả về một danh sách có độ dài lần lượt là 1 hoặc 0. Tuy nhiên, sẽ hiệu quả và dễ đọc hơn nếu bạn tránh tạo danh sách khi không cần thiết.Thông thường, các mục là thư mục sẽ tự động mở rộng thành nội dung của chúng khi bạn đặt Để tránh việc vô tình giữ lại các cấu trúc dữ liệu lớn ở giai đoạn phân tích vào giai đoạn thực thi, hàm Cảnh báo: Các câu lệnh |
format_each
|
string; hoặc None;
mặc định là NoneMột mẫu chuỗi định dạng không bắt buộc, được áp dụng cho từng chuỗi do hàm map_each trả về. Chuỗi định dạng phải có đúng một phần giữ chỗ "%s".
|
before_each
|
string; hoặc None;
mặc định là NoneMột đối số không bắt buộc để nối trước mỗi đối số bắt nguồn từ values được nối.
|
omit_if_empty
|
bool;
default is TrueNếu đúng, nếu không có đối số nào bắt nguồn từ values được thêm vào, thì mọi quá trình xử lý tiếp theo sẽ bị chặn và dòng lệnh sẽ không thay đổi. Nếu là false, tên đối số và terminate_with (nếu được cung cấp) vẫn sẽ được thêm vào bất kể có đối số nào khác hay không.
|
uniquify
|
bool;
default is FalseIf true, duplicate arguments that are derived from values will be omitted. Hệ thống sẽ chỉ giữ lại lần xuất hiện đầu tiên của mỗi đối số. Thường thì bạn không cần tính năng này vì depsets đã loại bỏ các mục trùng lặp, nhưng tính năng này có thể hữu ích nếu map_each phát cùng một chuỗi cho nhiều mục.
|
expand_directories
|
bool;
default is TrueIf true, any directories in values will be expanded to a flat list of files. Điều này xảy ra trước khi map_each được áp dụng.
|
terminate_with
|
string; hoặc None;
mặc định là NoneMột đối số không bắt buộc để thêm vào sau tất cả các đối số khác. Đối số này sẽ không được thêm nếu omit_if_empty là true (mặc định) và không có mục nào khác được thêm vào (như trường hợp values trống hoặc tất cả các mục của values đều được lọc).
|
allow_closure
|
bool;
mặc định là FalseNếu là true, cho phép sử dụng bao đóng trong các tham số hàm như map_each. Thông thường, điều này là không cần thiết và có nguy cơ giữ lại các cấu trúc dữ liệu lớn ở giai đoạn phân tích vào giai đoạn thực thi.
|
add_joined
Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False)
Quá trình xử lý tương tự như add_all(), nhưng danh sách các đối số bắt nguồn từ values được kết hợp thành một đối số duy nhất như thể bằng join_with.join(...), rồi được định dạng bằng mẫu chuỗi format_joined đã cho. Không giống như add_all(), không có tham số before_each hoặc terminate_with vì những tham số này thường không hữu ích khi các mục được kết hợp thành một đối số duy nhất.
Nếu sau khi lọc không có chuỗi nào để kết hợp thành một đối số và nếu omit_if_empty là true (mặc định), thì sẽ không có quá trình xử lý nào được thực hiện. Nếu không có chuỗi nào để nối nhưng omit_if_empty là false, thì chuỗi được nối sẽ là một chuỗi trống.
Thông số
| Thông số | Mô tả |
|---|---|
arg_name_or_values
|
required Nếu bạn truyền 2 tham số vị trí, thì tham số này sẽ được diễn giải là tên đối số. Tên arg được thêm trước values mà không cần xử lý. Đối số này sẽ không được thêm nếu omit_if_empty là true (mặc định) và không có chuỗi nào bắt nguồn từ values để kết hợp với nhau (điều này có thể xảy ra nếu values trống hoặc tất cả các mục của nó đều bị lọc). Nếu chỉ có một tham số vị trí được truyền, thì tham số đó sẽ được diễn giải là values (xem bên dưới).
|
values
|
sequence; hoặc depset;
mặc định là unboundDanh sách, bộ hoặc depset có các mục sẽ được kết hợp. |
join_with
|
string;
required Chuỗi dấu phân cách dùng để kết hợp các chuỗi thu được từ việc áp dụng map_each và format_each, theo cách tương tự như string.join().
|
map_each
|
có thể gọi; hoặc None; mặc định là NoneGiống như đối với add_all.
|
format_each
|
string; hoặc None;
mặc định là NoneTương tự như đối với add_all.
|
format_joined
|
string; hoặc None;
mặc định là NoneMột mẫu chuỗi định dạng không bắt buộc được áp dụng cho chuỗi đã nối. Chuỗi định dạng phải có đúng một phần giữ chỗ "%s". |
omit_if_empty
|
bool;
default is TrueIf true, if there are no strings to join together (either because values is empty or all its items are filtered), then all further processing is suppressed and the command line will be unchanged. Nếu là false, thì ngay cả khi không có chuỗi nào để kết hợp, hai đối số sẽ được thêm vào: tên đối số theo sau là một chuỗi rỗng (đây là kết quả kết hợp logic của 0 chuỗi).
|
uniquify
|
bool;
mặc định là FalseTương tự như đối với add_all.
|
expand_directories
|
bool;
mặc định là TrueTương tự như đối với add_all.
|
allow_closure
|
bool;
mặc định là FalseTương tự như đối với add_all.
|
set_param_file_format
Args Args.set_param_file_format(format)
Thông số
| Thông số | Mô tả |
|---|---|
format
|
string;
required Phải là một trong những giá trị sau:
Định dạng mặc định là "shell" nếu không được gọi. |
use_param_file
Args Args.use_param_file(param_file_arg, *, use_always=False)
Bazel có thể chọn bỏ qua việc ghi tệp tham số vào cây đầu ra trong quá trình thực thi để tăng hiệu quả. Nếu bạn đang gỡ lỗi các thao tác và muốn kiểm tra tệp tham số, hãy truyền --materialize_param_files vào bản dựng của bạn.
Thông số
| Thông số | Mô tả |
|---|---|
param_file_arg
|
string;
required Một chuỗi định dạng có một "%s". Nếu các đối số được chuyển sang tệp params, thì chúng sẽ được thay thế bằng một đối số bao gồm chuỗi này được định dạng bằng đường dẫn của tệp params. Ví dụ: nếu các đối số được chuyển đến tệp params "params.txt", thì việc chỉ định "--file=%s" sẽ khiến dòng lệnh hành động chứa "--file=params.txt". |
use_always
|
bool;
default is FalseWhether to always spill the args to a params file. Nếu là false, bazel sẽ quyết định xem các đối số có cần được trải ra hay không dựa trên hệ thống và độ dài đối số của bạn. |