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

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.2 · 8.1 · 8.0 · 7.6 · 7.5

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

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

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

ฉันควรใช้ 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 เวอร์ชันใดที่รองรับการย้ายข้อมูลนี้

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 ให้ตั้งเป็น "None"

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

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

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

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

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