บ่อยครั้งที่การดำเนินการต้องใช้บรรทัดคำสั่งขนาดใหญ่ที่มีค่าที่สะสมจากทรัพยากร 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;
default is 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
|
สตริง หรือ 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 จะตัดสินว่าต้องส่งอาร์กิวเมนต์หรือไม่โดยพิจารณาจากระบบและความยาวของอาร์กิวเมนต์ |