กลุ่มการดำเนินการอัตโนมัติจะเลือกแพลตฟอร์มการดำเนินการ สำหรับเครื่องมือแต่ละประเภท กล่าวอีกนัยหนึ่งคือ เป้าหมายหนึ่งๆ มีแพลตฟอร์มการดำเนินการได้หลายแพลตฟอร์มโดยไม่ต้องกำหนดกลุ่มการดำเนินการ
ข้อมูลสรุปสั้นๆ
กลุ่มการดำเนินการอัตโนมัติเชื่อมโยงกับเครื่องมืออย่างใกล้ชิด หากคุณใช้เครื่องมือ คุณต้องตั้งค่าเครื่องมือในการดำเนินการที่ได้รับผลกระทบ (การดำเนินการที่ใช้ไฟล์ปฏิบัติการหรือเครื่องมือจากเครื่องมือ) โดยเพิ่มพารามิเตอร์ 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 ซึ่งใช้ไฟล์ปฏิบัติการจาก //tools:toolchain_type_1 และ Second action ซึ่งใช้ไฟล์ปฏิบัติการจาก //tools:toolchain_type_2 ก่อนที่จะมี AEG การดำเนินการทั้ง 2 รายการนี้จะดำเนินการในแพลตฟอร์มการดำเนินการเดียวที่รองรับเครื่องมือทั้ง 2 ประเภท เมื่อใช้ AEG การดำเนินการแต่ละรายการจะดำเนินการในแพลตฟอร์มการดำเนินการที่ให้เครื่องมือโดยการเพิ่มพารามิเตอร์ toolchain ภายในรายการการดำเนินการ การดำเนินการอาจดำเนินการในแพลตฟอร์มการดำเนินการที่แตกต่างกัน
การดำเนินการนี้มีผลกับ ctx.actions.run_shell ด้วย โดยคุณควรเพิ่ม toolchain
เมื่อ tools มาจากเครื่องมือ
ความแตกต่างระหว่าง exec_groups ที่กำหนดเองกับ exec_groups อัตโนมัติ
ดังที่ชื่อระบุไว้ AEG คือ exec_groups ที่สร้างขึ้นโดยอัตโนมัติสำหรับเครื่องมือแต่ละประเภทที่ลงทะเบียนในกฎ คุณไม่จำเป็นต้องระบุด้วยตนเอง ซึ่งแตกต่างจาก exec_groups แบบ "คลาสสิก"
ฉันควรใช้ 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 ในกรณีที่เกิดข้อผิดพลาด
ตั้งค่า --incompatible_auto_exec_groups เป็น "เท็จ" เพื่อปิดใช้ AEG ในโปรเจ็กต์ของคุณโดยสมบูรณ์ (ปัญหา GitHub ของแฟล็ก) หรือปิดใช้กฎเฉพาะโดยตั้งค่าแอตทริบิวต์ _use_auto_exec_groups เป็น False (ดูรายละเอียดเพิ่มเติมเกี่ยวกับแอตทริบิวต์)
ข้อความแสดงข้อผิดพลาดขณะย้ายข้อมูลไปยัง AEG
ระบุไม่ได้ว่าเครื่องมือมาจากทรัพยากร Dependency โดยนัยหรือเครื่องมือ โปรดตั้งค่าพารามิเตอร์เครื่องมือ หากไม่ได้ใช้เครื่องมือ ให้ตั้งค่าเป็น "ไม่มี"
- ในกรณีนี้ คุณจะเห็นสแต็กของการเรียกก่อนที่จะเกิดข้อผิดพลาด และจะเห็นได้อย่างชัดเจนว่าการดำเนินการใดที่ต้องใช้พารามิเตอร์เครื่องมือ ตรวจสอบว่ามีการใช้เครื่องมือใดสำหรับการดำเนินการ แล้วตั้งค่าด้วยพารามิเตอร์เครื่องมือ หากไม่มีการใช้เครื่องมือภายในรายการการดำเนินการสำหรับเครื่องมือหรือไฟล์ปฏิบัติการ ให้ตั้งค่าเป็น
None
มีการประกาศการดำเนินการสำหรับเครื่องมือ "[toolchain_type]" ที่ไม่มีอยู่
- ซึ่งหมายความว่าคุณได้ตั้งค่าพารามิเตอร์เครื่องมือในการดำเนินการ แต่ไม่ได้ลงทะเบียนในกฎ ลงทะเบียนเครื่องมือหรือตั้งค่า
Noneภายในรายการการดำเนินการ
เนื้อหาเพิ่มเติม
ดูข้อมูลเพิ่มเติมได้ที่เอกสารการออกแบบ: กลุ่มการดำเนินการอัตโนมัติสำหรับเครื่องมือ.