บ่อยครั้งที่การดำเนินการต้องใช้บรรทัดคำสั่งขนาดใหญ่ที่มีค่าที่สะสมจากทรัพยากร Dependency แบบทรานซิทีฟ เช่น บรรทัดคำสั่งของ Linker อาจแสดงรายการไฟล์ออบเจ็กต์ทั้งหมดที่ไลบรารีทั้งหมดที่ลิงก์อยู่ต้องใช้ แนวทางปฏิบัติแนะนำคือการจัดเก็บข้อมูลแบบทรานซิทีฟดังกล่าวไว้ใน depset เพื่อให้เป้าหมายหลายรายการแชร์ข้อมูลได้ อย่างไรก็ตาม หากผู้เขียนกฎต้องแปลง depsets เหล่านี้เป็นรายการสตริงเพื่อสร้างบรรทัดคำสั่งการดำเนินการ ก็จะทำให้การเพิ่มประสิทธิภาพการแชร์หน่วยความจำนี้ไม่เกิดผล
ด้วยเหตุนี้ ฟังก์ชันการสร้างการทำงานจึงยอมรับออบเจ็กต์ Args นอกเหนือจากสตริง ออบเจ็กต์ Args แต่ละรายการแสดงการต่อกันของสตริงและ Depset โดยมีการแปลงที่ไม่บังคับสำหรับการจัดการข้อมูล Args จะไม่ประมวลผลชุดทรัพยากรที่ห่อหุ้มไว้จนกว่าจะถึงระยะการดำเนินการ เมื่อถึงเวลาคำนวณบรรทัดคำสั่ง ซึ่งจะช่วยเลื่อนการคัดลอกที่มีค่าใช้จ่ายสูงออกไปจนกว่าระยะการวิเคราะห์จะเสร็จสมบูรณ์ ดูข้อมูลเพิ่มเติมได้ที่หน้าการเพิ่มประสิทธิภาพ
Args สร้างขึ้นโดยการเรียกใช้ ctx.actions.args() โดยส่งเป็นพารามิเตอร์ arguments ของ ctx.actions.run() หรือ ctx.actions.run_shell() ได้ การเปลี่ยนแปลงแต่ละครั้งของออบเจ็กต์ Args จะต่อท้ายค่าไปยังบรรทัดคำสั่งสุดท้าย
map_each ช่วยให้คุณปรับแต่งวิธีแปลงรายการเป็นสตริงได้ หากคุณไม่ได้ระบุฟังก์ชัน map_each Conversion มาตรฐานจะเป็นดังนี้ 
- ระบบจะปล่อยให้ค่าที่เป็นสตริงอยู่แล้วเป็นไปตามเดิม
- ระบบจะเปลี่ยนออบเจ็กต์ Fileเป็นค่าFile.path
- ออบเจ็กต์ Labelจะเปลี่ยนเป็นสตริงที่แสดงถึงออบเจ็กต์นั้นๆ ซึ่งจะกลับไปเป็นออบเจ็กต์เดิมเมื่อมีการแก้ไขในบริบทของที่เก็บหลัก หากเป็นไปได้ การแสดงสตริงจะใช้ชื่อที่เห็นได้ชัดของที่เก็บแทนชื่อที่แน่นอนของที่เก็บ ซึ่งทำให้การแสดงนี้เหมาะสำหรับการใช้ในไฟล์ BUILD แม้ว่าจะไม่มีการรับประกันรูปแบบที่แน่นอนของการแสดง แต่ตัวอย่างทั่วไปคือ//foo:bar,@repo//foo:barและ@@canonical_name+//foo:bar.bzl
- ระบบจะเปลี่ยนประเภทอื่นๆ ทั้งหมดเป็นสตริงในลักษณะไม่ได้ระบุ ด้วยเหตุนี้ คุณจึงควรหลีกเลี่ยงการส่งค่าที่ไม่ใช่สตริงหรือประเภท Fileไปยังadd()และหากส่งไปยังadd_all()หรือadd_joined()คุณควรระบุฟังก์ชันmap_each
เมื่อใช้การจัดรูปแบบสตริง (พารามิเตอร์ format, format_each และ format_joined ของเมธอด add*()) ระบบจะตีความเทมเพลตรูปแบบในลักษณะเดียวกับการแทนที่ % ในสตริง ยกเว้นว่าเทมเพลตต้องมีตัวยึดตำแหน่งการแทนที่ 1 รายการเท่านั้น และต้องเป็น %s คุณอาจหลีกเลี่ยงเปอร์เซ็นต์ตามตัวอักษรได้โดยใช้ %% ระบบจะใช้การจัดรูปแบบหลังจากแปลงค่าเป็นสตริงตามที่ระบุไว้ข้างต้น
add*()เมธอดแต่ละรายการมีรูปแบบอื่นที่ยอมรับพารามิเตอร์ตำแหน่งเพิ่มเติม ซึ่งเป็นสตริง "ชื่ออาร์กิวเมนต์" ที่จะแทรกก่อนอาร์กิวเมนต์ที่เหลือ สำหรับ add_all และ add_joined ระบบจะไม่เพิ่มสตริงพิเศษหากลำดับกลายเป็นว่าง เช่น การใช้งานเดียวกันสามารถเพิ่ม --foo val1 val2 val3 --bar หรือเพียงแค่ --bar ลงในบรรทัดคำสั่งก็ได้ ขึ้นอยู่กับว่าลำดับที่ระบุมี val1..val3 หรือว่างเปล่า
หากขนาดของบรรทัดคำสั่งอาจยาวเกินขนาดสูงสุดที่ระบบอนุญาต คุณจะส่งอาร์กิวเมนต์ไปยังไฟล์พารามิเตอร์ได้ ดูuse_param_file() และ set_param_file_format()
ตัวอย่าง: สมมติว่าเราต้องการสร้างบรรทัดคำสั่ง
--foo foo1.txt foo2.txt ... fooN.txt --bar bar1.txt,bar2.txt,...,barM.txt --baz
Args ต่อไปนี้ได้ 
# foo_deps and bar_deps are depsets containing
# File objects for the foo and bar .txt files.
args = ctx.actions.args()
args.add_all("--foo", foo_deps)
args.add_joined("--bar", bar_deps, join_with=",")
args.add("--baz")
ctx.actions.run(
  ...
  arguments = [args],
  ...
)
สมาชิก
เพิ่ม
Args Args.add(arg_name_or_value, value=unbound, *, format=None)
พารามิเตอร์
| พารามิเตอร์ | คำอธิบาย | 
|---|---|
| arg_name_or_value | ต้องระบุ หากส่งพารามิเตอร์ตามตำแหน่ง 2 รายการ ระบบจะตีความพารามิเตอร์นี้เป็นชื่ออาร์กิวเมนต์ ระบบจะเพิ่มชื่ออาร์กิวเมนต์ก่อนค่าโดยไม่มีการประมวลผล หากมีการส่งพารามิเตอร์ตำแหน่งเพียงรายการเดียว ระบบจะตีความว่าเป็น value(ดูด้านล่าง) | 
| value | ค่าเริ่มต้นคือ unboundออบเจ็กต์ที่จะต่อท้าย ระบบจะแปลงเป็นสตริงโดยใช้การแปลงมาตรฐานที่กล่าวถึงข้างต้น เนื่องจากไม่มีพารามิเตอร์ map_eachสำหรับฟังก์ชันนี้valueจึงควรเป็นสตริงหรือFileต้องส่งรายการ ทูเพิล Depset หรือไดเรกทอรีFileไปยังadd_all()หรือadd_joined()แทนที่จะใช้วิธีนี้ | 
| format | string หรือ Noneค่าเริ่มต้นคือNoneรูปแบบสตริงรูปแบบที่จะนำไปใช้กับเวอร์ชันสตริงของ value | 
add_all
Args Args.add_all(arg_name_or_values, values=unbound, *, map_each=None, format_each=None, before_each=None, omit_if_empty=True, uniquify=False, expand_directories=True, terminate_with=None, allow_closure=False)
การประมวลผลส่วนใหญ่จะเกิดขึ้นกับรายการอาร์กิวเมนต์ที่จะต่อท้ายตามขั้นตอนต่อไปนี้
- Fileแต่ละรายการในไดเรกทอรีจะถูกแทนที่ด้วย- Fileทั้งหมดที่อยู่ในไดเรกทอรีนั้นแบบเรียกซ้ำ
- หากระบุ map_eachระบบจะใช้กับแต่ละรายการ และต่อรายการสตริงที่ได้เพื่อสร้างรายการอาร์กิวเมนต์เริ่มต้น ไม่เช่นนั้น รายการอาร์กิวเมนต์เริ่มต้นจะเป็นผลลัพธ์ของการใช้การแปลงมาตรฐานกับแต่ละรายการ
- อาร์กิวเมนต์แต่ละรายการในลิสต์จะจัดรูปแบบด้วย format_eachหากมี
- หาก uniquifyเป็นจริง ระบบจะนำอาร์กิวเมนต์ที่ซ้ำกันออก โดยการเกิดครั้งแรกจะเป็นรายการที่ยังคงอยู่
- หากระบุbefore_eachระบบจะแทรกเป็นอาร์กิวเมนต์ใหม่ก่อนอาร์กิวเมนต์ที่มีอยู่แต่ละรายการในรายการ ซึ่งจะเพิ่มจำนวนอาร์กิวเมนต์ที่จะต่อท้ายเป็น 2 เท่า ณ จุดนี้
- ยกเว้นในกรณีที่รายการว่างเปล่าและ omit_if_emptyเป็นจริง (ค่าเริ่มต้น) ระบบจะแทรกชื่ออาร์กิวเมนต์และterminate_withเป็นอาร์กิวเมนต์แรกและอาร์กิวเมนต์สุดท้ายตามลำดับ หากมีการระบุ
พารามิเตอร์
| พารามิเตอร์ | คำอธิบาย | 
|---|---|
| arg_name_or_values | ต้องระบุ หากส่งพารามิเตอร์ตามตำแหน่ง 2 รายการ ระบบจะตีความพารามิเตอร์นี้เป็นชื่ออาร์กิวเมนต์ ระบบจะเพิ่มชื่ออาร์กิวเมนต์ก่อน valuesเป็นอาร์กิวเมนต์แยกต่างหากโดยไม่มีการประมวลผล ระบบจะไม่เพิ่มชื่ออาร์กิวเมนต์นี้หากomit_if_emptyเป็นจริง (ค่าเริ่มต้น) และไม่มีการต่อท้ายรายการอื่นๆ (เช่นเดียวกับกรณีที่valuesว่างเปล่าหรือมีการกรองรายการทั้งหมด) หากมีการส่งพารามิเตอร์ตำแหน่งเพียงรายการเดียว ระบบจะตีความว่าเป็นvalues(ดูด้านล่าง) | 
| values | sequence หรือ depset
                                     ค่าเริ่มต้นคือ unboundรายการ ทูเพิล หรือ depset ที่จะต่อท้ายรายการ | 
| map_each | callable หรือ Noneค่าเริ่มต้นคือNoneฟังก์ชันที่แปลงแต่ละรายการเป็นสตริงตั้งแต่ 0 รายการขึ้นไป ซึ่งอาจได้รับการประมวลผลเพิ่มเติมก่อนที่จะต่อท้าย หากไม่ได้ระบุพารามิเตอร์นี้ ระบบจะใช้ Conversion มาตรฐาน ฟังก์ชันจะรับอาร์กิวเมนต์ตำแหน่ง 1 หรือ 2 รายการ ได้แก่ รายการที่จะแปลง ตามด้วย  ประเภทของค่าที่ส่งคืนจะขึ้นอยู่กับจำนวนอาร์กิวเมนต์ที่จะสร้างสำหรับรายการ 
 Noneจะมีผลเหมือนกับการแสดงผลรายการที่มีความยาว 1 หรือ 0 ตามลำดับ อย่างไรก็ตาม การหลีกเลี่ยงการสร้างรายการในกรณีที่ไม่จำเป็นจะช่วยให้โค้ดมีประสิทธิภาพและอ่านได้ง่ายขึ้นโดยปกติแล้ว รายการที่เป็นไดเรกทอรีจะขยายเป็นเนื้อหาโดยอัตโนมัติเมื่อตั้งค่า  หากต้องการหลีกเลี่ยงการเก็บโครงสร้างข้อมูลขนาดใหญ่ในระยะการวิเคราะห์ไว้ในระยะการดำเนินการโดยไม่ตั้งใจ คุณต้องประกาศฟังก์ชัน  คำเตือน: คำสั่ง  | 
| format_each | string หรือ None;
                                     default isNoneรูปแบบสตริงที่ไม่บังคับซึ่งใช้กับสตริงแต่ละรายการที่ฟังก์ชัน map_eachส่งคืน สตริงรูปแบบต้องมีตัวยึดตำแหน่ง "%s" เพียง 1 รายการ | 
| before_each | string หรือ None;
                                     ค่าเริ่มต้นคือNoneอาร์กิวเมนต์ที่ไม่บังคับเพื่อต่อท้ายก่อนที่จะต่อท้ายอาร์กิวเมนต์แต่ละรายการที่ได้จาก values | 
| omit_if_empty | bool;
                                     ค่าเริ่มต้นคือ Trueหากเป็นจริง หากไม่มีอาร์กิวเมนต์ที่ได้มาจาก valuesที่จะต่อท้าย ระบบจะระงับการประมวลผลเพิ่มเติมทั้งหมดและบรรทัดคำสั่งจะไม่เปลี่ยนแปลง หากเป็นเท็จ ระบบจะยังคงต่อท้ายชื่ออาร์กิวเมนต์และterminate_with(หากระบุ) ไม่ว่าจะมีอาร์กิวเมนต์อื่นๆ หรือไม่ก็ตาม | 
| uniquify | bool;
                                     ค่าเริ่มต้นคือ Falseหากเป็นจริง ระบบจะละเว้นอาร์กิวเมนต์ที่ซ้ำกันซึ่งได้มาจาก valuesระบบจะเก็บเฉพาะอาร์กิวเมนต์แรกของแต่ละรายการไว้ โดยปกติแล้วไม่จำเป็นต้องใช้ฟีเจอร์นี้เนื่องจากชุดทรัพยากรที่ขึ้นต่อกันจะละเว้นรายการที่ซ้ำกันอยู่แล้ว แต่ฟีเจอร์นี้อาจมีประโยชน์หากmap_eachส่งสตริงเดียวกันสำหรับหลายรายการ | 
| expand_directories | bool;
                                     ค่าเริ่มต้นคือ Trueหากเป็นจริง ระบบจะขยายไดเรกทอรีใน valuesเป็นรายการไฟล์แบบแบน โดยจะเกิดขึ้นก่อนที่จะใช้map_each | 
| terminate_with | สตริง หรือ None;
                                     ค่าเริ่มต้นคือNoneอาร์กิวเมนต์ที่ไม่บังคับเพื่อผนวกหลังอาร์กิวเมนต์อื่นๆ ทั้งหมด ระบบจะไม่เพิ่มอาร์กิวเมนต์นี้หาก omit_if_emptyเป็นจริง (ค่าเริ่มต้น) และไม่มีการเพิ่มรายการอื่นๆ (เช่น ในกรณีที่valuesว่างเปล่าหรือมีการกรองรายการทั้งหมด) | 
| allow_closure | bool;
                                     ค่าเริ่มต้นคือ Falseหากเป็นจริง จะอนุญาตให้ใช้ Closure ในพารามิเตอร์ฟังก์ชัน เช่น map_eachโดยปกติแล้วไม่จำเป็นต้องทำเช่นนี้ และอาจเสี่ยงต่อการเก็บโครงสร้างข้อมูลระยะการวิเคราะห์ขนาดใหญ่ไว้ในระยะการดำเนินการ | 
add_joined
Args Args.add_joined(arg_name_or_values, values=unbound, *, join_with, map_each=None, format_each=None, format_joined=None, omit_if_empty=True, uniquify=False, expand_directories=True, allow_closure=False)
การประมวลผลจะคล้ายกับ add_all() แต่ระบบจะรวมรายการอาร์กิวเมนต์ที่ได้จาก values เป็นอาร์กิวเมนต์เดียวราวกับว่าใช้ join_with.join(...) แล้วจัดรูปแบบโดยใช้เทมเพลตสตริง format_joined ที่ระบุ add_all() ต่างจาก before_each หรือพารามิเตอร์ terminate_with เนื่องจากโดยทั่วไปแล้วพารามิเตอร์เหล่านี้ไม่มีประโยชน์เมื่อรวมรายการเป็นอาร์กิวเมนต์เดียว
หากหลังจากการกรองแล้วไม่มีสตริงที่จะรวมเป็นอาร์กิวเมนต์ และหาก omit_if_empty เป็นจริง (ค่าเริ่มต้น) ระบบจะไม่ประมวลผล ไม่เช่นนั้น หากไม่มีสตริงที่จะรวม แต่ omit_if_empty เป็นเท็จ สตริงที่รวมจะเป็นสตริงว่าง
          
      
พารามิเตอร์
| พารามิเตอร์ | คำอธิบาย | 
|---|---|
| arg_name_or_values | ต้องระบุ หากส่งพารามิเตอร์ตามตำแหน่ง 2 รายการ ระบบจะตีความพารามิเตอร์นี้เป็นชื่ออาร์กิวเมนต์ ระบบจะเพิ่มชื่ออาร์กิวเมนต์ก่อน valuesโดยไม่มีการประมวลผล ระบบจะไม่เพิ่มอาร์กิวเมนต์นี้หากomit_if_emptyเป็นจริง (ค่าเริ่มต้น) และไม่มีสตริงที่ได้จากvaluesเพื่อรวมเข้าด้วยกัน (ซึ่งอาจเกิดขึ้นหากvaluesว่างเปล่าหรือมีการกรองรายการทั้งหมด) หากมีการส่งพารามิเตอร์ตำแหน่งเพียงรายการเดียว ระบบจะตีความว่าเป็นvalues(ดูด้านล่าง) | 
| values | sequence หรือ depset
                                     ค่าเริ่มต้นคือ unboundรายการ ทูเพิล หรือ depset ที่จะรวมรายการ | 
| join_with | string;
                                     required สตริงตัวคั่นที่ใช้เพื่อรวมสตริงที่ได้จากการใช้ map_eachและformat_eachเข้าด้วยกันในลักษณะเดียวกับstring.join() | 
| map_each | เรียกใช้ได้ หรือ Noneค่าเริ่มต้นคือNoneเหมือนกับ add_all | 
| format_each | สตริง หรือ Noneค่าเริ่มต้นคือNoneเหมือนกับ add_all | 
| format_joined | string หรือ None;
                                     ค่าเริ่มต้นคือNoneรูปแบบสตริงที่เป็นรูปแบบเสริมซึ่งใช้กับสตริงที่รวมกัน สตริงรูปแบบต้องมีตัวยึดตำแหน่ง "%s" เพียง 1 รายการ | 
| omit_if_empty | bool;
                                     ค่าเริ่มต้นคือ Trueหากเป็นจริง หากไม่มีสตริงที่จะรวมเข้าด้วยกัน (เนื่องจาก valuesว่างเปล่าหรือรายการทั้งหมดถูกกรอง) ระบบจะระงับการประมวลผลเพิ่มเติมทั้งหมดและบรรทัดคำสั่งจะไม่เปลี่ยนแปลง หากเป็นเท็จ แม้ว่าจะไม่มีสตริงที่จะรวมกัน แต่ระบบจะผนวกอาร์กิวเมนต์ 2 รายการ ได้แก่ ชื่ออาร์กิวเมนต์ตามด้วยสตริงว่าง (ซึ่งเป็นการรวมสตริง 0 รายการเชิงตรรกะ) | 
| uniquify | bool;
                                     ค่าเริ่มต้นคือ Falseเหมือนกับสำหรับ add_all | 
| expand_directories | bool;
                                     ค่าเริ่มต้นคือ Trueเหมือนกับสำหรับ add_all | 
| allow_closure | bool;
                                     ค่าเริ่มต้นคือ Falseเหมือนกับสำหรับ add_all | 
set_param_file_format
Args Args.set_param_file_format(format)
พารามิเตอร์
| พารามิเตอร์ | คำอธิบาย | 
|---|---|
| format | string
                                     required Must be one of: 
 รูปแบบจะเป็น "shell" โดยค่าเริ่มต้นหากไม่ได้เรียกใช้ | 
use_param_file
Args Args.use_param_file(param_file_arg, *, use_always=False)
Bazel อาจเลือกที่จะละเว้นการเขียนไฟล์พารามิเตอร์ไปยังทรีเอาต์พุตในระหว่างการดำเนินการเพื่อประสิทธิภาพ หากคุณกำลังแก้ไขข้อบกพร่องของ Actions และต้องการตรวจสอบไฟล์พารามิเตอร์ ให้ส่ง --materialize_param_files ไปยังบิลด์
          
      
พารามิเตอร์
| พารามิเตอร์ | คำอธิบาย | 
|---|---|
| param_file_arg | สตริง
                                     ต้องระบุ สตริงรูปแบบที่มี "%s" รายการเดียว หากมีการส่งอาร์กิวเมนต์ไปยังไฟล์พารามิเตอร์ ระบบจะแทนที่อาร์กิวเมนต์เหล่านั้นด้วยอาร์กิวเมนต์ที่ประกอบด้วยสตริงนี้ซึ่งจัดรูปแบบด้วยเส้นทางของไฟล์พารามิเตอร์ ตัวอย่างเช่น หากมีการส่งอาร์กิวเมนต์ไปยังไฟล์พารามิเตอร์ "params.txt" การระบุ "--file=%s" จะทําให้บรรทัดคําสั่งการกระทํามี "--file=params.txt" | 
| use_always | bool;
                                     ค่าเริ่มต้นคือ Falseว่าจะส่งอาร์กิวเมนต์ไปยังไฟล์พารามิเตอร์เสมอหรือไม่ หากเป็นเท็จ Bazel จะตัดสินใจว่าต้องส่งอาร์กิวเมนต์หรือไม่โดยอิงตามระบบและความยาวของอาร์กิวเมนต์ |