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

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

กลุ่มการดำเนินการอัตโนมัติเชื่อมต่อกับ 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 หลายรายการในแพลตฟอร์มการดำเนินการเดียว (การดำเนินการใช้ไฟล์ที่เรียกใช้งานได้หรือเครื่องมือจาก 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 ที่ใช้ เพื่อค้นหาแพลตฟอร์มการดำเนินการที่รองรับทั้ง 2 ประเภทของ Toolchain ระบบใช้แพลตฟอร์มการดำเนินการที่เลือกสำหรับแต่ละการดำเนินการที่ลงทะเบียนไว้ในกฎ เว้นแต่จะ ระบุไว้เป็นอย่างอื่นด้วย exec_groups กล่าวอีกนัยหนึ่งคือ การดำเนินการทั้งหมดภายในกฎเคยมีการดำเนินการเดียว แพลตฟอร์มแม้ว่าจะใช้เครื่องมือจาก Toolchain ที่แตกต่างกัน (เลือกแพลตฟอร์มการดำเนินการ สำหรับแต่ละเป้าหมาย) ซึ่งส่งผลให้เกิดข้อผิดพลาดเมื่อไม่มีแพลตฟอร์มการดำเนินการที่รองรับเชนเครื่องมือทั้งหมด

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

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

ctx.actions.run_shell ก็มีผลเช่นเดียวกัน โดยควรเพิ่มtoolchain พารามิเตอร์เมื่อtoolsมาจาก Toolchain

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

ตามชื่อที่ระบุ AEG คือกลุ่มผู้บริหารที่สร้างขึ้นโดยอัตโนมัติสำหรับแต่ละ ประเภทเครื่องมือที่ลงทะเบียนในกฎ คุณไม่จำเป็นต้องระบุด้วยตนเอง ซึ่งต่างจากกลุ่มผู้บริหาร "คลาสสิก" นอกจากนี้ ระบบจะตั้งชื่อ AEG เป็นประเภท Toolchain โดยอัตโนมัติ (เช่น //tools:toolchain_type_1)

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

คุณต้องใช้ exec_groups ที่กำหนดเองในกรณีที่ต้องใช้ Toolchain หลายรายการ เพื่อเรียกใช้ในแพลตฟอร์มการดำเนินการเดียวเท่านั้น ในกรณีอื่นๆ ทั้งหมด คุณไม่จำเป็นต้อง กำหนด 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 เป็น "จริง" ดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์นี้ได้ในปัญหาเกี่ยวกับ GitHub

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

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

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

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

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

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

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

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

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

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

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

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

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