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

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

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

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

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

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

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

ประวัติ

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

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

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

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

เมื่อใช้ AEG ระบบจะเลือกแพลตฟอร์มการดำเนินการสำหรับ Toolchain แต่ละประเภท ฟังก์ชันการใช้งานของตัวอย่าง 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 ซึ่งใช้ปฏิบัติการจาก //tools:toolchain_type_1 และ Second action ซึ่งใช้ปฏิบัติการได้จาก //tools:toolchain_type_2 ก่อนจะมี AEG การดำเนินการทั้ง 2 อย่างนี้จะดำเนินการบนแพลตฟอร์มการดำเนินการเดียวที่รองรับ Toolchain ทั้ง 2 ประเภท เมื่อใช้ AEG การเพิ่มพารามิเตอร์ toolchain ภายในการดำเนินการจะทำให้แต่ละการดำเนินการทำงานในแพลตฟอร์มการดำเนินการที่มี Toolchain การดำเนินการดังกล่าวอาจดำเนินการ ในแพลตฟอร์มการดำเนินการที่แตกต่างกัน

วิธีนี้จะใช้ได้ผลกับ ctx.actions.run_shell ในตําแหน่งที่ควรเพิ่มพารามิเตอร์ toolchain เมื่อ tools มาจาก Toolchain

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

AEG เป็นกลุ่มผู้บริหารที่สร้างขึ้นโดยอัตโนมัติสำหรับ Toolchain แต่ละประเภทที่ลงทะเบียนไว้ในกฎตามชื่อ 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

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

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

Bazel 7 รองรับ AEG อย่างสมบูรณ์

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

ตั้งค่า --incompatible_auto_exec_groups เป็น "จริง" ข้อมูลเพิ่มเติมเกี่ยวกับการแจ้งว่าไม่เหมาะสมในปัญหาเกี่ยวกับ GitHub

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

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

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

การดำเนินการนี้จะเปิดใช้ AEG เฉพาะใน my_rule และการดำเนินการของ AEG จะใช้ตรรกะใหม่เมื่อเลือกแพลตฟอร์มการดำเนินการ แฟล็กที่เข้ากันไม่ได้จะถูกลบล้างด้วยแอตทริบิวต์นี้

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

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

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

ระบุไม่ได้ว่าเครื่องมือมาจากทรัพยากร Dependency โดยนัยหรือ Toolchain โปรดตั้งค่าพารามิเตอร์ Toolchain หากคุณไม่ได้ใช้ Toolchain ให้กำหนดเป็น "ไม่มี"

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

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

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

สื่อเพิ่มเติม

ดูข้อมูลเพิ่มเติมได้จากเอกสารการออกแบบ กลุ่มการดำเนินการอัตโนมัติสำหรับ Toolchain