กลุ่มการเรียกใช้อัตโนมัติ (AEG)

รายงานปัญหา ดูแหล่งที่มา รุ่นรายวัน · 8.0 · 7.4 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

กลุ่มการเรียกใช้อัตโนมัติจะเลือกแพลตฟอร์มการเรียกใช้สำหรับเครื่องมือทางเทคนิคแต่ละประเภท กล่าวคือ เป้าหมายหนึ่งๆ อาจมีแพลตฟอร์มการเรียกใช้หลายแพลตฟอร์มได้โดยไม่ต้องกำหนดกลุ่มการเรียกใช้

ข้อมูลสรุปสั้นๆ

กลุ่มการดําเนินการอัตโนมัติมีความเชื่อมโยงกับชุดเครื่องมืออย่างใกล้ชิด หากใช้ toolchain คุณต้องตั้งค่าในการดำเนินการที่ได้รับผลกระทบ (การดำเนินการที่ใช้ไฟล์ปฏิบัติการหรือเครื่องมือจาก toolchain) โดยเพิ่มพารามิเตอร์ toolchain เช่น

ctx.actions.run(
    ...,
    executable = ctx.toolchain['@bazel_tools//tools/jdk:toolchain_type'].tool,
    ...,
    toolchain = '@bazel_tools//tools/jdk:toolchain_type',
)

หากการดำเนินการไม่ได้ใช้เครื่องมือหรือไฟล์ปฏิบัติการจากเครื่องมือทางเทคนิค และ Blaze ตรวจไม่พบ (ข้อผิดพลาดเกิดขึ้น) คุณจะตั้งค่าtoolchain = Noneได้

หากต้องการใช้เครื่องมือทางเทคนิคหลายรายการในแพลตฟอร์มการดําเนินการเดียว (การดำเนินการใช้ไฟล์ปฏิบัติการหรือเครื่องมือจากเครื่องมือทางเทคนิคตั้งแต่ 2 รายการขึ้นไป) คุณต้องกำหนด exec_groups ด้วยตนเอง (ดูส่วนฉันควรใช้ exec_group ที่กําหนดเองเมื่อใด)

ประวัติ

ก่อนที่จะมี AEG แพลตฟอร์มการดําเนินการจะเลือกที่ระดับกฎ เช่น

my_rule = rule(
    _impl,
    toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
)

กฎ my_rule ลงทะเบียนเครื่องมือทางเทคนิค 2 ประเภท ซึ่งหมายความว่าการแก้ปัญหาเกี่ยวกับเครื่องมือทางเทคนิคที่ใช้เพื่อค้นหาแพลตฟอร์มการเรียกใช้ที่รองรับเครื่องมือทางเทคนิคทั้ง 2 ประเภท ระบบจะใช้แพลตฟอร์มการดำเนินการที่เลือกสำหรับการดำเนินการที่ลงทะเบียนแต่ละรายการภายในกฎ เว้นแต่จะมีการระบุไว้เป็นอย่างอื่นด้วย exec_groups กล่าวคือ การดำเนินการทั้งหมดภายในกฎเคยมีแพลตฟอร์มการดำเนินการเดียว แม้ว่าจะใช้เครื่องมือจากเครื่องมือทางเทคนิคที่แตกต่างกัน (ระบบจะเลือกแพลตฟอร์มการดำเนินการสำหรับแต่ละเป้าหมาย) ซึ่งส่งผลให้การดำเนินการล้มเหลวเมื่อไม่มีแพลตฟอร์มการดําเนินการที่รองรับเครื่องมือทางเทคนิคทั้งหมด

สถานะปัจจุบัน

เมื่อใช้ AEG ระบบจะเลือกแพลตฟอร์มการดําเนินการสําหรับเครื่องมือทางเทคนิคแต่ละประเภท ฟังก์ชันการใช้งานของตัวอย่างก่อนหน้านี้อย่าง my_rule จะมีลักษณะดังนี้

def _impl(ctx):
    ctx.actions.run(
      mnemonic = "First action",
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      toolchain = '//tools:toolchain_type_1',
    )

    ctx.actions.run(
      mnemonic = "Second action",
      executable = ctx.toolchain['//tools:toolchain_type_2'].tool,
      toolchain = '//tools:toolchain_type_2',
    )

กฎนี้จะสร้างการดำเนินการ 2 รายการ ได้แก่ First action ที่ใช้ไฟล์ปฏิบัติการจาก a //tools:toolchain_type_1 และ Second action ที่ใช้ไฟล์ปฏิบัติการจาก a //tools:toolchain_type_2 ก่อน AEG การดำเนินการทั้ง 2 รายการนี้จะดำเนินการบนแพลตฟอร์มการดำเนินการเดียวที่รองรับทั้ง 2 ประเภทของเครื่องมือทางเทคนิค เมื่อใช้ AEG โดยการใส่พารามิเตอร์ toolchain ไว้ในการดำเนินการ การดำเนินการแต่ละรายการจะทำงานบนแพลตฟอร์มการดำเนินการที่ให้ชุดเครื่องมือ การดําเนินการอาจดําเนินการบนแพลตฟอร์มการดําเนินการที่แตกต่างกัน

การดำเนินการเดียวกันนี้มีผลกับ ctx.actions.run_shell ซึ่งควรเพิ่มพารามิเตอร์ toolchain เมื่อ tools มาจากชุดเครื่องมือ

ความแตกต่างระหว่างกลุ่มการเรียกใช้ที่กำหนดเองกับกลุ่มการเรียกใช้อัตโนมัติ

AEG เป็นกลุ่มผู้ดําเนินการที่สร้างโดยอัตโนมัติสําหรับเครื่องมือทางเทคนิคแต่ละประเภทที่ลงทะเบียนในกฎ คุณไม่จำเป็นต้องระบุด้วยตนเอง ต่างจากกลุ่มผู้บริหาร "คลาสสิก"

ฉันควรใช้ exec_group ที่กําหนดเองเมื่อใด

คุณต้องใช้ exec_groups ที่กําหนดเองเฉพาะในกรณีที่ต้องใช้งานเครื่องมือทางเทคนิคหลายชุดบนแพลตฟอร์มการดําเนินการเดียว ในกรณีอื่นๆ ทั้งหมด คุณไม่จําเป็นต้องกําหนด exec_groups ที่กําหนดเอง เช่น

def _impl(ctx):
    ctx.actions.run(
      ...,
      executable = ctx.toolchain['//tools:toolchain_type_1'].tool,
      tools = [ctx.toolchain['//tools:toolchain_type_2'].tool],
      exec_group = 'two_toolchains',
    )
my_rule = rule(
    _impl,
    exec_groups = {
        "two_toolchains": exec_group(
            toolchains = ['//tools:toolchain_type_1', '//tools:toolchain_type_2'],
        ),
    }
)

การย้ายข้อมูล AEG

Blaze ใช้ AEG อยู่แล้วภายใน google3 สำหรับการย้ายข้อมูลภายนอกของ Bazel นั้นอยู่ระหว่างดำเนินการ กฎบางรายการใช้ฟีเจอร์นี้อยู่แล้ว (เช่น กฎ Java และ C++)

Bazel เวอร์ชันใดบ้างที่รองรับการย้ายข้อมูลนี้

AEG ได้รับการสนับสนุนอย่างเต็มรูปแบบจาก Bazel 7

วิธีเปิดใช้ AEG

ตั้งค่า --incompatible_auto_exec_groups เป็น true ข้อมูลเพิ่มเติมเกี่ยวกับ Flag อยู่ในปัญหา GitHub

วิธีเปิดใช้ AEG ภายในกฎที่เฉพาะเจาะจง

ตั้งค่าแอตทริบิวต์ _use_auto_exec_groups ในกฎ

my_rule = rule(
    _impl,
    attrs = {
      "_use_auto_exec_groups": attr.bool(default = True),
    }
)

ซึ่งจะเปิดใช้ AEG ใน my_rule เท่านั้น และการดําเนินการของ AEG จะเริ่มใช้ตรรกะใหม่เมื่อเลือกแพลตฟอร์มการเรียกใช้ แอตทริบิวต์นี้จะลบล้าง Flag ที่เข้ากันไม่ได้

วิธีปิดใช้ AEG ในกรณีที่เกิดข้อผิดพลาด

ตั้งค่า --incompatible_auto_exec_groups เป็น false เพื่อปิดใช้ AEG ในโปรเจ็กต์โดยสมบูรณ์ (ปัญหา GitHub ของ Flag) หรือปิดใช้กฎที่เฉพาะเจาะจงโดยตั้งค่าแอตทริบิวต์ _use_auto_exec_groups เป็น False (รายละเอียดเพิ่มเติมเกี่ยวกับแอตทริบิวต์)

ข้อความแสดงข้อผิดพลาดขณะย้ายข้อมูลไปยัง AEG

ไม่สามารถระบุได้ว่าเครื่องมือมาจากข้อกําหนดเบื้องต้นหรือเป็นชุดเครื่องมือ โปรดตั้งค่าพารามิเตอร์ toolchain หากคุณไม่ได้ใช้ชุดเครื่องมือ ให้ตั้งค่าเป็น "ไม่มี"

  • ในกรณีนี้ คุณจะเห็นสแต็กการเรียกใช้ก่อนที่ข้อผิดพลาดจะเกิดขึ้น และสามารถดูได้อย่างชัดเจนว่าการดำเนินการใดต้องใช้พารามิเตอร์เครื่องมือทางเทคนิค ตรวจสอบว่าใช้ Toolchain ใดสําหรับการดำเนินการและตั้งค่าด้วยพารามิเตอร์ Toolchain หากไม่ได้ใช้ชุดเครื่องมือภายในการดำเนินการสำหรับเครื่องมือหรือไฟล์ปฏิบัติการ ให้ตั้งค่าเป็น None

การดำเนินการที่ประกาศสำหรับเครื่องมือทางเทคนิค "[toolchain_type]" ที่ไม่มีอยู่

  • ซึ่งหมายความว่าคุณได้ตั้งค่าพารามิเตอร์เครื่องมือในการดำเนินการ แต่ไม่ได้ลงทะเบียนในกฎ ลงทะเบียนเครื่องมือหรือตั้งค่า None ภายในการดำเนินการ

เนื้อหาเพิ่มเติม

ดูข้อมูลเพิ่มเติมได้ที่เอกสารการออกแบบ Automatic exec groups for toolchains