Nhóm thực thi

Báo cáo sự cố Xem nguồn

Nhóm thực thi cho phép nhiều nền tảng thực thi trong một mục tiêu duy nhất. Mỗi nhóm thực thi đều có các phần phụ thuộc chuỗi công cụ riêng và tự thực hiện hoạt động phân giải trong chuỗi công cụ riêng.

Thông tin khái quát

Nhóm thực thi cho phép tác giả quy tắc xác định các nhóm thao tác, mỗi nhóm thao tác có một nền tảng thực thi có thể khác nhau. Nhiều nền tảng thực thi có thể cho phép thực thi các thao tác theo nhiều cách, chẳng hạn như biên dịch ứng dụng iOS trên một worker từ xa (linux) và sau đó liên kết/ký mã trên một trình chạy Mac cục bộ.

Việc có thể xác định các nhóm hành động cũng giúp giảm bớt việc sử dụng thao tác ghi nhớ hành động làm proxy để chỉ định hành động. Thuật toán ghi nhớ không đảm bảo là duy nhất và chỉ có thể tham chiếu đến một hành động. Điều này đặc biệt hữu ích trong việc phân bổ thêm tài nguyên cho bộ nhớ cụ thể và xử lý các thao tác chuyên sâu như liên kết trong các bản dựng C++ mà không cần phân bổ quá mức cho các tác vụ tốn ít công sức hơn.

Xác định nhóm thực thi

Trong quá trình định nghĩa quy tắc, tác giả quy tắc có thể khai báo một tập hợp các nhóm thực thi. Trên mỗi nhóm thực thi, tác giả quy tắc có thể chỉ định mọi thứ cần thiết để chọn một nền tảng thực thi cho nhóm thực thi đó, cụ thể là mọi quy tắc ràng buộc thông qua exec_compatible_with và các loại chuỗi công cụ thông qua toolchain.

# foo.bzl
my_rule = rule(
    _impl,
    exec_groups = {
        “link”: exec_group(
            exec_compatible_with = [ "@platforms//os:linux" ]
            toolchains = ["//foo:toolchain_type"],
        ),
        “test”: exec_group(
            toolchains = ["//foo_tools:toolchain_type"],
        ),
    },
    attrs = {
        "_compiler": attr.label(cfg = config.exec("link"))
    },
)

Trong đoạn mã trên, bạn có thể thấy rằng các phần phụ thuộc công cụ cũng có thể chỉ định hiệu ứng chuyển đổi cho một nhóm thực thi bằng cách sử dụng tham số thuộc tính cfg và mô-đun config. Mô-đun này hiển thị một hàm exec với tham số chuỗi là tên của nhóm executor mà bạn sẽ tạo phần phụ thuộc.

Giống như trong các quy tắc gốc, nhóm thực thi test xuất hiện theo mặc định trên các quy tắc kiểm thử Starlark.

Truy cập vào nhóm thực thi

Trong quá trình triển khai quy tắc, bạn có thể khai báo rằng các hành động sẽ chạy trên nền tảng thực thi của nhóm thực thi. Bạn có thể thực hiện việc này bằng cách sử dụng tham số exec_group của các phương thức tạo hành động, cụ thể là ctx.actions.runctx.actions.run_shell.

# foo.bzl
def _impl(ctx):
  ctx.actions.run(
     inputs = [ctx.attr._some_tool, ctx.srcs[0]]
     exec_group = "compile",
     # ...
  )

Tác giả quy tắc cũng sẽ có thể truy cập vào chuỗi công cụ đã giải quyết của các nhóm thực thi, tương tự như cách bạn có thể truy cập chuỗi công cụ đã phân giải của mục tiêu:

# foo.bzl
def _impl(ctx):
  foo_info = ctx.exec_groups["link"].toolchains["//foo:toolchain_type"].fooinfo
  ctx.actions.run(
     inputs = [foo_info, ctx.srcs[0]]
     exec_group = "link",
     # ...
  )

Sử dụng nhóm thực thi để đặt thuộc tính thực thi

Các nhóm thực thi được tích hợp với thuộc tính exec_properties tồn tại trên mọi quy tắc và cho phép đối tượng ghi mục tiêu chỉ định một chuỗi các thuộc tính mà sau đó được truyền đến máy móc thực thi. Ví dụ: nếu muốn thiết lập một số thuộc tính (chẳng hạn như bộ nhớ) cho mục tiêu và phân bổ bộ nhớ cao hơn cho một số hành động nhất định, bạn sẽ ghi một mục nhập exec_properties có khoá tăng cường nhóm thực thi, chẳng hạn như:

# BUILD
my_rule(
    name = 'my_target',
    exec_properties = {
        'mem': '12g',
        'link.mem': '16g'
    }
    …
)

Mọi thao tác có exec_group = "link" sẽ thấy từ điển thuộc tính executor dưới dạng {"mem": "16g"}. Như bạn thấy ở đây, các chế độ cài đặt cấp nhóm thực thi sẽ ghi đè các chế độ cài đặt cấp mục tiêu.

Nhóm thực thi cho quy tắc gốc

Có các nhóm thực thi sau cho các hành động được xác định theo quy tắc gốc:

  • test: Kiểm thử các hành động trong trình chạy.
  • cpp_link: Hành động liên kết C++.

Nhóm thực thi và thuộc tính thực thi trên nền tảng

Bạn có thể xác định exec_properties cho các nhóm thực thi tuỳ ý trên các mục tiêu nền tảng (không giống như exec_properties được đặt trực tiếp trên một mục tiêu, trong đó thuộc tính cho các nhóm thực thi không xác định sẽ bị từ chối). Sau đó, các mục tiêu sẽ kế thừa exec_properties của nền tảng thực thi ảnh hưởng đến nhóm thực thi mặc định và mọi nhóm thực thi khác có liên quan.

Ví dụ: giả sử chạy kiểm thử C++ cần có một số tài nguyên, nhưng không bắt buộc để biên dịch và liên kết; tài nguyên này có thể được mô hình hoá như sau:

constraint_setting(name = "resource")
constraint_value(name = "has_resource", constraint_setting = ":resource")

platform(
    name = "platform_with_resource",
    constraint_values = [":has_resource"],
    exec_properties = {
        "test.resource": "...",
    },
)

cc_test(
    name = "my_test",
    srcs = ["my_test.cc"],
    exec_compatible_with = [":has_resource"],
)

exec_properties được xác định trực tiếp trên các mục tiêu sẽ được ưu tiên so với các đối tượng kế thừa từ nền tảng thực thi.