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