ออบเจ็กต์ที่แคปซูลข้อมูลที่จำเป็นต่อการสร้างบรรทัดคำสั่งบางส่วนหรือทั้งหมดในลักษณะที่ประหยัดหน่วยความจำ
บ่อยครั้งที่การดำเนินการต้องใช้บรรทัดคำสั่งขนาดใหญ่ซึ่งมีค่าที่สะสมจากทรัพยากร Dependency แบบทรานซิทีฟ เช่น บรรทัดคำสั่งของ Linker อาจแสดงรายการไฟล์ออบเจ็กต์ทั้งหมดที่ไลบรารีทั้งหมดที่ลิงก์อยู่ต้องใช้ แนวทางปฏิบัติแนะนำคือการจัดเก็บข้อมูลแบบทรานซิทีฟดังกล่าวไว้ใน depset
เพื่อให้เป้าหมายหลายรายการแชร์ข้อมูลได้ อย่างไรก็ตาม หากผู้เขียนกฎต้องแปลง depsets เหล่านี้เป็นรายการสตริงเพื่อสร้างบรรทัดคำสั่งการดำเนินการ ก็จะทำให้การเพิ่มประสิทธิภาพการแชร์หน่วยความจำนี้ไม่เป็นผล
ด้วยเหตุนี้ ฟังก์ชันการสร้างการทำงานจึงยอมรับออบเจ็กต์ Args
นอกเหนือจากสตริง ออบเจ็กต์แต่ละรายการ Args
แสดงถึงการต่อสตริงและ Depset โดยมีการเปลี่ยนแปลงที่ไม่บังคับสำหรับการจัดการข้อมูล Args
จะไม่ประมวลผล depsets ที่ห่อหุ้มไว้จนกว่าจะถึงระยะการดำเนินการเมื่อถึงเวลาคำนวณบรรทัดคำสั่ง ซึ่งจะช่วยเลื่อนการคัดลอกที่มีค่าใช้จ่ายสูงออกไปจนกว่าระยะการวิเคราะห์จะเสร็จสิ้น ดูข้อมูลเพิ่มเติมได้ที่หน้าการเพิ่มประสิทธิภาพ
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 ;
ค่าเริ่มต้นคือ None รูปแบบสตริงที่เป็นรูปแบบที่ไม่บังคับ ซึ่งใช้กับสตริงแต่ละรายการที่ฟังก์ชัน map_each ส่งคืน สตริงรูปแบบต้องมีตัวยึดตำแหน่ง "%s" เพียง 1 รายการ
|
before_each
|
สตริง หรือ 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;
ต้องระบุ สตริงตัวคั่นที่ใช้เพื่อรวมสตริงที่ได้จากการใช้ map_each และ format_each เข้าด้วยกันในลักษณะเดียวกับ string.join()
|
map_each
|
เรียกใช้ได้ หรือ None
ค่าเริ่มต้นคือ None เหมือนกับ add_all
|
format_each
|
string หรือ 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
|
string;
ต้องระบุ สตริงรูปแบบที่มี "%s" รายการเดียว หากมีการส่งอาร์กิวเมนต์ไปยังไฟล์พารามิเตอร์ ระบบจะแทนที่อาร์กิวเมนต์เหล่านั้นด้วยอาร์กิวเมนต์ที่ประกอบด้วยสตริงนี้ซึ่งจัดรูปแบบด้วยเส้นทางของไฟล์พารามิเตอร์ ตัวอย่างเช่น หากมีการส่งอาร์กิวเมนต์ไปยังไฟล์พารามิเตอร์ "params.txt" การระบุ "--file=%s" จะทําให้บรรทัดคําสั่งการกระทํามี "--file=params.txt" |
use_always
|
bool;
ค่าเริ่มต้นคือ False ว่าจะส่งอาร์กิวเมนต์ไปยังไฟล์พารามิเตอร์เสมอหรือไม่ หากเป็นเท็จ Bazel จะตัดสินว่าต้องส่งอาร์กิวเมนต์หรือไม่โดยอิงตามระบบและความยาวของอาร์กิวเมนต์ |