กฎ
ชื่อแทน
alias(name, actual, compatible_with, deprecation, features, restricted_to, tags, target_compatible_with, testonly, visibility)
alias กฎจะสร้างชื่ออื่นที่ใช้เรียกกฎได้
การตั้งค่าชื่อแทนใช้ได้กับเป้าหมาย "ปกติ" เท่านั้น โดยเฉพาะอย่างยิ่ง package_group
และ test_suite จะตั้งชื่อแทนไม่ได้
กฎนามแฝงมีการประกาศการมองเห็นของตัวเอง ในด้านอื่นๆ ทั้งหมด จะทำงาน เหมือนกับกฎที่อ้างอิง (เช่น ระบบจะไม่สนใจ testonly ในนามแฝง แต่จะใช้ testonly-ness ของกฎที่อ้างอิงแทน) โดยมีข้อยกเว้นเล็กน้อยดังนี้
-
ระบบจะไม่เรียกใช้การทดสอบหากมีการกล่าวถึงนามแฝงในบรรทัดคำสั่ง หากต้องการกำหนดนามแฝง
ที่เรียกใช้การทดสอบที่อ้างอิง ให้ใช้กฎ
test_suiteที่มีเป้าหมายเดียวในแอตทริบิวต์tests -
เมื่อกำหนดกลุ่มสภาพแวดล้อม ระบบจะไม่รองรับชื่อแทนของ
environmentกฎ และไม่รองรับในตัวเลือกบรรทัดคำสั่ง--target_environmentด้วย
ตัวอย่าง
filegroup(
name = "data",
srcs = ["data.txt"],
)
alias(
name = "other",
actual = ":data",
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
actual
|
|
config_setting
config_setting(name, constraint_values, define_values, deprecation, distribs, features, flag_values, licenses, tags, testonly, values, visibility)
ตรงกับสถานะการกำหนดค่าที่คาดไว้ (แสดงเป็นแฟล็กบิลด์หรือข้อจำกัดของแพลตฟอร์ม) เพื่อ วัตถุประสงค์ในการเรียกใช้แอตทริบิวต์ที่กำหนดค่าได้ ดูวิธีใช้กฎนี้ได้ที่เลือก และดูภาพรวมของฟีเจอร์ทั่วไปได้ที่ แอตทริบิวต์ที่กำหนดค่าได้
ตัวอย่าง
การจับคู่ต่อไปนี้จะใช้ได้กับบิลด์ที่ตั้งค่า --compilation_mode=opt หรือ
-c opt (ไม่ว่าจะตั้งค่าอย่างชัดเจนในบรรทัดคำสั่งหรือโดยนัยจากไฟล์ .bazelrc)
config_setting(
name = "simple",
values = {"compilation_mode": "opt"}
)
รายการต่อไปนี้จะตรงกับบิลด์ที่กำหนดเป้าหมายเป็น ARM และใช้การกำหนดที่กำหนดเอง
FOO=bar (เช่น bazel build --cpu=arm --define FOO=bar ...)
config_setting(
name = "two_conditions",
values = {
"cpu": "arm",
"define": "FOO=bar"
}
)
รายการต่อไปนี้จะตรงกับบิลด์ที่ตั้งค่า
Flag ที่ผู้ใช้กำหนด
--//custom_flags:foo=1 (ไม่ว่าจะระบุอย่างชัดเจนในบรรทัดคำสั่งหรือโดยนัยจาก
ไฟล์ .bazelrc):
config_setting(
name = "my_custom_flag_is_set",
flag_values = { "//custom_flags:foo": "1" },
)
การจับคู่ต่อไปนี้จะจับคู่บิลด์ที่กำหนดเป้าหมายเป็นแพลตฟอร์มที่มีสถาปัตยกรรม x86_64 และ glibc
เวอร์ชัน 2.25 โดยสมมติว่ามี constraint_value ที่มีป้ายกำกับ
//example:glibc_2_25 โปรดทราบว่าแพลตฟอร์มจะยังคงตรงกันหากกำหนดค่าข้อจำกัดเพิ่มเติม
นอกเหนือจาก 2 ค่านี้
config_setting(
name = "64bit_glibc_2_25",
constraint_values = [
"@platforms//cpu:x86_64",
"//example:glibc_2_25",
]
)
config_setting จะไม่ตรงกับแฟล็กบรรทัดคำสั่งระดับบนสุด แต่ก็อาจตรงกับเป้าหมายการสร้างบางรายการ
หมายเหตุ
- ดูเลือกเพื่อดูสิ่งที่เกิดขึ้นเมื่อมี
config_settingหลายรายการที่ตรงกับสถานะการกำหนดค่าปัจจุบัน - สำหรับ Flag ที่รองรับรูปแบบย่อ (เช่น
--compilation_modeกับ-c)valuesคำจำกัดความต้องใช้รูปแบบเต็ม ระบบจะจับคู่การเรียกใช้โดยอัตโนมัติ โดยใช้รูปแบบใดรูปแบบหนึ่ง -
หากแฟล็กมีหลายค่า (เช่น
--copt=-Da --copt=-Dbหรือ แฟล็ก Starlark ประเภทรายการ)values = { "flag": "a" }จะตรงกันหาก"a"อยู่ที่ใดก็ได้ในรายการจริงvalues = { "myflag": "a,b" }ทำงานในลักษณะเดียวกัน โดยจะจับคู่กับ--myflag=a --myflag=b,--myflag=a --myflag=b --myflag=c,--myflag=a,bและ--myflag=c,b,aความหมายที่แน่นอนจะแตกต่างกันไปในแต่ละ แฟล็ก เช่น--coptไม่รองรับหลายค่าในอินสแตนซ์เดียวกัน:--copt=a,bจะสร้าง["a,b"]ในขณะที่--copt=a --copt=bจะสร้าง["a", "b"](ดังนั้นvalues = { "copt": "a,b" }จึงตรงกับค่าแรกแต่ไม่ตรงกับค่าที่สอง) แต่--ios_multi_cpus(สำหรับกฎของ Apple) ทำ:-ios_multi_cpus=a,bและios_multi_cpus=a --ios_multi_cpus=bทั้ง 2 รายการจะสร้าง["a", "b"]ตรวจสอบคำจำกัดความของฟีเจอร์และทดสอบ เงื่อนไขอย่างละเอียดเพื่อยืนยันความคาดหวังที่แน่นอน - หากต้องการกำหนดเงื่อนไขที่ไม่ได้สร้างแบบจำลองโดยแฟล็กบิลด์ในตัว ให้ใช้
แฟล็กที่กำหนดโดย Starlark คุณใช้
--defineได้เช่นกัน แต่การรองรับจะน้อยกว่าและเราไม่แนะนำให้ใช้วิธีนี้ ดูการสนทนาเพิ่มเติมได้ที่นี่ - หลีกเลี่ยงการทำซ้ำ
config_settingคำจำกัดความที่เหมือนกันในแพ็กเกจต่างๆ แต่ให้อ้างอิงconfig_settingทั่วไปที่กำหนดไว้ในแพ็กเกจ Canonical แทน valuesdefine_valuesและconstraint_valuesสามารถใช้ร่วมกันได้ในconfig_settingเดียวกัน แต่อย่างน้อยต้องตั้งค่า 1 รายการ สำหรับconfig_settingที่กำหนด
อาร์กิวเมนต์
| Attributes | |
|---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
constraint_values
|
constraint_values ขั้นต่ำที่แพลตฟอร์มเป้าหมายต้องระบุ
เพื่อให้ตรงกับ config_setting นี้ (ระบบจะไม่พิจารณาแพลตฟอร์มการดำเนินการในที่นี้) ระบบจะไม่สนใจค่าข้อจำกัดเพิ่มเติมที่แพลตฟอร์มมี ดูรายละเอียดได้ที่
แอตทริบิวต์การสร้างที่กำหนดค่าได้
ในกรณีที่ |
define_values
|
values แต่
สำหรับธง --define โดยเฉพาะ
ซึ่งหมายความว่า
config_setting(
name = "a_and_b",
values = {
"define": "a=1",
"define": "b=2",
})
ใช้ไม่ได้เนื่องจากคีย์เดียวกัน (
config_setting(
name = "a_and_b",
define_values = {
"a": "1",
"b": "2",
})
ตรงกับ
|
flag_values
|
values แต่
สำหรับ
Flag บิลด์ที่ผู้ใช้กำหนด
นี่เป็นแอตทริบิวต์ที่แตกต่างกันเนื่องจากมีการอ้างอิงแฟล็กที่กำหนดโดยผู้ใช้เป็นป้ายกำกับ ขณะที่ มีการอ้างอิงแฟล็กในตัวเป็นสตริงที่กำหนดเอง |
values
|
กฎนี้จะรับค่ากำหนดของการกำหนดค่าเป้าหมายที่
อ้างอิงในคำสั่ง เพื่อความสะดวก ค่าการกำหนดค่าจะระบุเป็นแฟล็กบิลด์ (ไม่มี หากไม่ได้ตั้งค่าสถานะอย่างชัดเจนในบรรทัดคำสั่ง ระบบจะใช้ค่าเริ่มต้นของสถานะ
หากคีย์ปรากฏหลายครั้งในพจนานุกรม ระบบจะใช้เฉพาะอินสแตนซ์สุดท้าย
หากคีย์อ้างอิงแฟล็กที่ตั้งค่าได้หลายครั้งในบรรทัดคำสั่ง (เช่น
|
กลุ่มไฟล์
filegroup(name, srcs, data, compatible_with, deprecation, distribs, features, licenses, output_group, restricted_to, tags, target_compatible_with, testonly, visibility)
ใช้ filegroup เพื่อตั้งชื่อที่สะดวกให้กับกลุ่มเป้าหมาย
จากนั้นจะอ้างอิงจากกฎอื่นๆ ได้
เราขอแนะนำให้ใช้ filegroup แทนการอ้างอิงไดเรกทอรีโดยตรง
วิธีหลังไม่ถูกต้องเนื่องจากระบบบิลด์ไม่มีความรู้เกี่ยวกับไฟล์ทั้งหมดที่อยู่ใต้ไดเรกทอรีอย่างครบถ้วน จึงอาจไม่สร้างใหม่เมื่อไฟล์เหล่านี้เปลี่ยนแปลง เมื่อรวมกับ glob, filegroup จะช่วยให้มั่นใจได้ว่าระบบบิลด์จะรู้จักไฟล์ทั้งหมดอย่างชัดเจน
ตัวอย่าง
หากต้องการสร้าง filegroup ที่ประกอบด้วยไฟล์ต้นฉบับ 2 ไฟล์ ให้ทำดังนี้
filegroup(
name = "mygroup",
srcs = [
"a_file.txt",
"some/subdirectory/another_file.txt",
],
)
หรือใช้ glob เพื่อค้นหาไดเรกทอรี testdata
filegroup(
name = "exported_testdata",
srcs = glob([
"testdata/*.dat",
"testdata/logs/**/*.log",
]),
)
หากต้องการใช้คำจำกัดความเหล่านี้ ให้อ้างอิง filegroup พร้อมป้ายกำกับจากกฎใดก็ได้
cc_library(
name = "my_library",
srcs = ["foo.cc"],
data = [
"//my_package:exported_testdata",
"//my_package:mygroup",
],
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
srcs
|
โดยทั่วไปจะใช้ผลลัพธ์ของนิพจน์ glob สำหรับ
ค่าของแอตทริบิวต์ |
data
|
ระบบจะเพิ่มเป้าหมายที่ระบุในแอตทริบิวต์ |
output_group
|
"กลุ่มเอาต์พุต" คือหมวดหมู่ของอาร์ติแฟกต์เอาต์พุตของเป้าหมายที่ระบุไว้ในการใช้งานกฎนั้น |
genquery
genquery(name, deps, data, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, expression, features, licenses, opts, restricted_to, scope, strict, tags, target_compatible_with, testonly, visibility)
genquery() เรียกใช้การค้นหาที่ระบุใน
ภาษาการค้นหาของ Blaze และส่งออกผลลัพธ์
ลงในไฟล์
เพื่อให้การสร้างมีความสอดคล้องกัน ระบบจะอนุญาตให้คําค้นหาเข้าชมได้เฉพาะ
การปิดทรานซิทีฟของเป้าหมายที่ระบุในแอตทริบิวต์ scope
เท่านั้น คําค้นหาที่ละเมิดกฎนี้จะทํางานไม่สําเร็จในระหว่างการดําเนินการหาก
ไม่ได้ระบุ strict หรือระบุเป็น "จริง" (หาก strict เป็น "เท็จ"
ระบบจะข้ามเป้าหมายที่อยู่นอกขอบเขตพร้อมคําเตือน) วิธีที่ง่ายที่สุดในการป้องกันไม่ให้เกิดเหตุการณ์นี้คือการระบุป้ายกำกับเดียวกันในขอบเขตกับในนิพจน์การค้นหา
ความแตกต่างเพียงอย่างเดียวระหว่างคำค้นหาที่อนุญาตที่นี่กับในบรรทัดคำสั่งคือไม่อนุญาตให้ใช้คำค้นหาที่มีข้อกำหนดเป้าหมายแบบไวลด์การ์ด (เช่น //pkg:* หรือ //pkg:all) ที่นี่
เหตุผลมี 2 ประการ ประการแรกคือ genquery ต้องระบุขอบเขตเพื่อป้องกันไม่ให้เป้าหมายภายนอกการปิดทรานซิทีฟของคำค้นหามีผลต่อเอาต์พุต และประการที่สองคือไฟล์ BUILD ไม่รองรับการขึ้นต่อกันแบบไวลด์การ์ด (เช่น deps=["//a/..."] ไม่ได้รับอนุญาต)
เอาต์พุตของ genquery จะเรียงตาม --order_output=full เพื่อบังคับใช้เอาต์พุตที่แน่นอน
ชื่อไฟล์เอาต์พุตคือชื่อของกฎ
ตัวอย่าง
ตัวอย่างนี้จะเขียนรายการป้ายกำกับใน Closure แบบทรานซิทีฟของเป้าหมายที่ระบุลงในไฟล์
genquery(
name = "kiwi-deps",
expression = "deps(//kiwi:kiwi_lib)",
scope = ["//kiwi:kiwi_lib"],
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
expression
|
:b ในแอตทริบิวต์นี้ในไฟล์ a/BUILD จะอ้างอิงถึงเป้าหมาย //:b
|
opts
|
bazel query ได้ ไม่อนุญาตให้ใช้ตัวเลือกการค้นหาบางรายการ
ที่นี่: --keep_going, --query_file, --universe_scope,
--order_results และ --order_output ตัวเลือกที่ไม่ได้ระบุไว้ที่นี่
จะมีค่าเริ่มต้นเช่นเดียวกับในบรรทัดคำสั่งของ bazel query
|
scope
|
|
strict
|
|
genrule
genrule(name, srcs, outs, cmd, cmd_bash, cmd_bat, cmd_ps, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exec_tools, executable, features, licenses, local, message, output_licenses, output_to_bindir, restricted_to, tags, target_compatible_with, testonly, toolchains, tools, visibility)
genruleสร้างไฟล์อย่างน้อย 1 ไฟล์โดยใช้คำสั่ง Bash ที่ผู้ใช้กำหนด
Genrules เป็นกฎการสร้างทั่วไปที่คุณใช้ได้หากไม่มีกฎเฉพาะสำหรับงาน
เช่น คุณสามารถเรียกใช้คำสั่ง Bash แบบบรรทัดเดียวได้ อย่างไรก็ตาม หากคุณต้องการคอมไพล์ไฟล์ C++ ให้ใช้cc_*กฎที่มีอยู่ต่อไป เนื่องจากเราได้ดำเนินการที่ซับซ้อนทั้งหมดให้คุณแล้ว
อย่าใช้ genrule สำหรับการเรียกใช้การทดสอบ มีการยกเว้นพิเศษสำหรับการทดสอบและผลการทดสอบ รวมถึงนโยบายการแคชและตัวแปรสภาพแวดล้อม โดยทั่วไปแล้วจะต้องเรียกใช้การทดสอบ
หลังจากสร้างเสร็จและในสถาปัตยกรรมเป้าหมาย ในขณะที่ genrule จะดำเนินการระหว่าง
การสร้างและในสถาปัตยกรรมโฮสต์ (ทั้ง 2 อย่างอาจแตกต่างกัน) หากต้องการกฎการทดสอบทั่วไป ให้ใช้ sh_test
ข้อควรพิจารณาในการคอมไพล์แบบข้ามระบบ
ดูข้อมูลเพิ่มเติมเกี่ยวกับการคอมไพล์ข้ามได้ในคู่มือผู้ใช้
แม้ว่า genrules จะทำงานระหว่างการสร้าง แต่เอาต์พุตมักจะใช้หลังจากการสร้างสำหรับการติดตั้งใช้งานหรือ การทดสอบ ลองพิจารณาตัวอย่างการคอมไพล์โค้ด C สำหรับไมโครคอนโทรลเลอร์ โดยคอมไพเลอร์จะยอมรับไฟล์ต้นฉบับ C และสร้างโค้ดที่ทำงานในไมโครคอนโทรลเลอร์ โค้ดที่สร้างขึ้นจะรันบน CPU ที่ใช้สร้างไม่ได้อย่างแน่นอน แต่คอมไพเลอร์ C (หากคอมไพล์จากแหล่งที่มา) ต้องรันได้
ระบบบิลด์ใช้การกำหนดค่าโฮสต์เพื่ออธิบายเครื่องที่บิลด์ทำงาน และการกำหนดค่าเป้าหมายเพื่ออธิบายเครื่องที่เอาต์พุตของบิลด์ ควรทำงาน โดยจะมีตัวเลือกในการกำหนดค่าแต่ละรายการ และจะแยกไฟล์ที่เกี่ยวข้องไว้ในไดเรกทอรีที่แยกต่างหากเพื่อหลีกเลี่ยงความขัดแย้ง
สำหรับ genrules ระบบบิลด์จะตรวจสอบว่ามีการสร้างการขึ้นต่อกันอย่างเหมาะสม ดังนี้
srcs จะได้รับการสร้าง (หากจำเป็น) สำหรับการกำหนดค่าเป้าหมาย
tools จะได้รับการสร้างสำหรับการกำหนดค่าโฮสต์ และระบบจะพิจารณาว่าเอาต์พุต
เป็นการกำหนดค่าเป้าหมาย นอกจากนี้ ยังมี
ตัวแปร "Make" ที่คำสั่ง genrule สามารถส่งไปยังเครื่องมือที่เกี่ยวข้องได้
เราตั้งใจที่จะไม่กำหนดแอตทริบิวต์ deps ใน genrule เนื่องจากกฎในตัวอื่นๆ ใช้ข้อมูลเมตาที่ขึ้นอยู่กับภาษาซึ่งส่งผ่านระหว่างกฎเพื่อกำหนดวิธีจัดการกฎที่ขึ้นต่อกันโดยอัตโนมัติ แต่การทำงานอัตโนมัติในระดับนี้ไม่สามารถใช้กับ genrule ได้ Genrules ทำงาน
ที่ระดับไฟล์และไฟล์ที่เรียกใช้เท่านั้น
กรณีพิเศษ
การคอมไพล์โฮสต์-โฮสต์: ในบางกรณี ระบบบิลด์จำเป็นต้องเรียกใช้ genrules เพื่อให้เอาต์พุตสามารถเรียกใช้ระหว่างบิลด์ได้ด้วย เช่น หาก genrule สร้างคอมไพเลอร์ที่กำหนดเอง
ซึ่ง genrule อื่นจะใช้ในภายหลัง genrule แรกจะต้องสร้างเอาต์พุตสำหรับการกำหนดค่าโฮสต์
เนื่องจากเป็นที่ที่คอมไพเลอร์จะทำงานใน genrule อื่น ในกรณีนี้
ระบบบิลด์จะทําสิ่งที่ถูกต้องโดยอัตโนมัติ นั่นคือสร้าง srcs และ
outs ของ genrule แรกสําหรับการกําหนดค่าโฮสต์แทนการกําหนดค่าเป้าหมาย ดูข้อมูลเพิ่มเติมได้ที่คู่มือผู้ใช้
เครื่องมือ JDK และ C++: หากต้องการใช้เครื่องมือจาก JDK หรือชุดคอมไพเลอร์ C++ ระบบบิลด์ จะมีชุดตัวแปรให้ใช้ ดูรายละเอียดได้ที่ตัวแปร "Make"
สภาพแวดล้อม Genrule
คำสั่ง genrule จะดำเนินการโดยเชลล์ Bash ที่กำหนดค่าให้ล้มเหลวเมื่อคำสั่ง
หรือไปป์ไลน์ล้มเหลว โดยใช้ set -e -o pipefail
เครื่องมือบิลด์จะเรียกใช้คำสั่ง Bash ในสภาพแวดล้อมของกระบวนการที่ผ่านการล้างข้อมูล ซึ่ง
กำหนดเฉพาะตัวแปรหลัก เช่น PATH, PWD,
TMPDIR และตัวแปรอื่นๆ อีก 2-3 ตัว
เพื่อให้มั่นใจว่าบิลด์สามารถทำซ้ำได้ ระบบจะไม่ส่งตัวแปรส่วนใหญ่ที่กำหนดไว้ในเชลล์ของผู้ใช้
ไปยังคำสั่งของ genrule อย่างไรก็ตาม Bazel (แต่ไม่ใช่ Blaze) จะส่งค่าของตัวแปรสภาพแวดล้อม PATH ของผู้ใช้
การเปลี่ยนแปลงค่าของ PATH จะทำให้ Bazel เรียกใช้คำสั่งอีกครั้ง
ในการสร้างครั้งถัดไป
คำสั่ง genrule ไม่ควรเข้าถึงเครือข่าย ยกเว้นเพื่อเชื่อมต่อกระบวนการที่เป็น กระบวนการย่อยของคำสั่งนั้นเอง แม้ว่าปัจจุบันจะไม่มีการบังคับใช้ก็ตาม
ระบบบิลด์จะลบไฟล์เอาต์พุตที่มีอยู่โดยอัตโนมัติ แต่จะสร้างไดเรกทอรีระดับบนที่จำเป็นก่อนที่จะเรียกใช้ genrule นอกจากนี้ยังนำไฟล์เอาต์พุตออกในกรณีที่เกิดข้อผิดพลาดด้วย
คำแนะนำทั่วไป
- โปรดตรวจสอบว่าเครื่องมือที่ genrule เรียกใช้เป็นแบบดีเทอร์มินิสติกและเฮอร์เมติก โดยไม่ควรเขียน การประทับเวลาลงในเอาต์พุต และควรใช้การจัดลำดับที่เสถียรสำหรับชุดและแผนที่ รวมถึง เขียนเฉพาะเส้นทางไฟล์แบบสัมพัทธ์ไปยังเอาต์พุตเท่านั้น ไม่ใช่เส้นทางแบบสัมบูรณ์ การไม่ปฏิบัติตามกฎนี้จะ ทําให้เกิดลักษณะการทํางานของบิลด์ที่ไม่คาดคิด (Bazel ไม่สร้าง genrule ที่คุณคิดว่าจะสร้าง) และ ทําให้ประสิทธิภาพของแคชลดลง
- ใช้
$(location)อย่างกว้างขวางสำหรับเอาต์พุต เครื่องมือ และแหล่งที่มา เนื่องจากมีการแยกไฟล์เอาต์พุตสำหรับการกำหนดค่าต่างๆ genrule จึงไม่สามารถใช้เส้นทางที่ฮาร์ดโค้ด และ/หรือเส้นทางแบบสัมบูรณ์ได้ - เขียนมาโคร Starlark ทั่วไปในกรณีที่มีการใช้ genrule เดียวกันหรือคล้ายกันมากในหลายที่ หาก genrule มีความซับซ้อน ให้พิจารณาใช้ในสคริปต์หรือเป็น กฎ Starlark ซึ่งจะช่วยให้อ่านและทดสอบได้ง่ายขึ้น
- โปรดตรวจสอบว่ารหัสออกระบุความสำเร็จหรือความล้มเหลวของ genrule อย่างถูกต้อง
- อย่าเขียนข้อความข้อมูลไปยัง stdout หรือ stderr แม้ว่าจะมีประโยชน์สำหรับการแก้ไขข้อบกพร่อง แต่ก็อาจ กลายเป็นเสียงรบกวนได้ง่ายๆ genrule ที่สำเร็จควรไม่มีเอาต์พุต ในทางกลับกัน genrule ที่ล้มเหลว ควรแสดงข้อความแสดงข้อผิดพลาดที่ดี
$$evaluates to a$, a literal dollar-sign, so in order to invoke a shell command containing dollar-signs such asls $(dirname $x), one must escape it thus:ls $$(dirname $$x)- หลีกเลี่ยงการสร้างลิงก์สัญลักษณ์และไดเรกทอรี Bazel จะไม่คัดลอกโครงสร้างไดเรกทอรี/ซิมลิงก์ ที่สร้างโดย genrule และการตรวจสอบการขึ้นต่อกันของไดเรกทอรีก็ไม่ถูกต้อง
- เมื่ออ้างอิง genrule ในกฎอื่นๆ คุณจะใช้ป้ายกำกับของ genrule หรือป้ายกำกับของไฟล์เอาต์พุตแต่ละไฟล์ก็ได้ บางครั้งวิธีหนึ่งอาจอ่านง่ายกว่า แต่อีกวิธีหนึ่งอาจอ่านง่ายกว่าในบางครั้ง การอ้างอิงเอาต์พุตตามชื่อใน
srcsของกฎที่ใช้จะช่วยหลีกเลี่ยง การเลือกเอาต์พุตอื่นๆ ของ genrule โดยไม่ตั้งใจ แต่ก็อาจน่าเบื่อหาก genrule สร้างเอาต์พุตจำนวนมาก
ตัวอย่าง
ตัวอย่างนี้สร้าง foo.h ไม่มีแหล่งที่มาเนื่องจากคำสั่งไม่ได้ใช้
อินพุตใดๆ "ไบนารี" ที่คำสั่งเรียกใช้คือสคริปต์ Perl ในแพ็กเกจเดียวกันกับ genrule
genrule(
name = "foo",
srcs = [],
outs = ["foo.h"],
cmd = "./$(location create_foo.pl) > \"$@\"",
tools = ["create_foo.pl"],
)
ตัวอย่างต่อไปนี้แสดงวิธีใช้ filegroup
และเอาต์พุตของ genrule อื่น โปรดทราบว่าการใช้ $(SRCS) แทน
คำสั่ง $(location) ที่ชัดเจนก็ใช้ได้เช่นกัน ตัวอย่างนี้ใช้คำสั่งหลังเพื่อ
วัตถุประสงค์ในการสาธิต
genrule(
name = "concat_all_files",
srcs = [
"//some:files", # a filegroup with multiple files in it ==> $(locations)
"//other:gen", # a genrule with a single output ==> $(location)
],
outs = ["concatenated.txt"],
cmd = "cat $(locations //some:files) $(location //other:gen) > $@",
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ คุณอ้างอิงถึงกฎนี้ตามชื่อได้ในส่วน srcs หรือ deps ของกฎ BUILD
อื่นๆ หากกฎสร้างไฟล์ต้นฉบับ คุณควรใช้แอตทริบิวต์
srcs
|
srcs
|
แอตทริบิวต์นี้ไม่เหมาะกับการแสดงเครื่องมือที่ดำเนินการโดย
ระบบบิลด์จะตรวจสอบว่ามีการสร้างข้อกำหนดเบื้องต้นเหล่านี้ก่อนที่จะเรียกใช้คำสั่ง genrule
โดยจะสร้างขึ้นโดยใช้การกำหนดค่าเดียวกันกับคำขอบิลด์เดิม ชื่อไฟล์ของข้อกำหนดเบื้องต้นเหล่านี้พร้อมใช้งานกับคำสั่งเป็นรายการที่คั่นด้วยช่องว่างใน |
outs
|
ไฟล์เอาต์พุตต้องไม่อยู่นอกขอบเขตของแพ็กเกจ ระบบจะตีความชื่อไฟล์เอาต์พุตเป็นแบบสัมพัทธ์กับแพ็กเกจ
หากตั้งค่าแฟล็ก
คำสั่ง genrule คาดว่าจะสร้างไฟล์เอาต์พุตแต่ละไฟล์ในตำแหน่งที่กำหนดไว้ล่วงหน้า
ตำแหน่งจะพร้อมใช้งานใน |
cmd
|
$(location)
และ "Make"
cmd_bash, cmd_ps และ cmd_bat
หากไม่มีตัวเลือกใดที่เกี่ยวข้อง
หากความยาวของบรรทัดคำสั่งเกินขีดจำกัดของแพลตฟอร์ม (64K ใน Linux/macOS, 8K ใน Windows)
genrule จะเขียนคำสั่งลงในสคริปต์และเรียกใช้สคริปต์นั้นเพื่อหลีกเลี่ยง ซึ่ง
ใช้กับแอตทริบิวต์ cmd ทั้งหมด ( |
cmd_bash
|
แอตทริบิวต์นี้มีลำดับความสำคัญสูงกว่า |
cmd_bat
|
แอตทริบิวต์นี้มีลำดับความสำคัญสูงกว่า
|
cmd_ps
|
แอตทริบิวต์นี้มีลำดับความสำคัญสูงกว่า
เพื่อให้ใช้ Powershell ได้ง่ายขึ้นและมีข้อผิดพลาดน้อยลง เราจึงเรียกใช้คำสั่งต่อไปนี้ เพื่อตั้งค่าสภาพแวดล้อมก่อนที่จะเรียกใช้คำสั่ง Powershell ใน genrule
|
exec_tools
|
tools ทุกประการ ยกเว้นว่าการขึ้นต่อกันเหล่านี้
จะได้รับการกำหนดค่าสำหรับแพลตฟอร์มการดำเนินการของกฎแทนการกำหนดค่าโฮสต์
ซึ่งหมายความว่าทรัพยากร Dependency ใน exec_tools จะไม่ขึ้นอยู่กับข้อจำกัดเดียวกันกับทรัพยากร Dependency ใน tools โดยเฉพาะอย่างยิ่ง ไม่จำเป็นต้อง
ใช้การกำหนดค่าโฮสต์สำหรับทรัพยากร Dependency แบบทรานซิทีฟของตนเอง ดูรายละเอียดเพิ่มเติมได้ที่
tools
ทีม Blaze กำลังย้ายข้อมูลการใช้งาน |
executable
|
การตั้งค่าสถานะนี้เป็น "จริง" หมายความว่าเอาต์พุตเป็นไฟล์ที่สั่งการได้และเรียกใช้ได้โดยใช้คำสั่ง
ระบบไม่รองรับการประกาศการขึ้นต่อกันของข้อมูลสำหรับไฟล์ที่เรียกใช้งานที่สร้างขึ้น |
local
|
หากตั้งค่าเป็น "จริง" ตัวเลือกนี้จะบังคับให้
ซึ่งเทียบเท่ากับการระบุ "local" เป็นแท็ก ( |
message
|
ข้อความความคืบหน้าที่จะพิมพ์เมื่อมีการเรียกใช้ขั้นตอนการสร้างนี้ โดยค่าเริ่มต้น ข้อความจะเป็น "กำลังสร้างเอาต์พุต" (หรือข้อความที่คล้ายกัน) แต่คุณอาจระบุข้อความที่เจาะจงมากขึ้นได้ ใช้แอตทริบิวต์นี้แทน |
output_licenses
|
common attributes
|
output_to_bindir
|
หากตั้งค่าเป็น "จริง" ตัวเลือกนี้จะทำให้ระบบเขียนไฟล์เอาต์พุตลงในไดเรกทอรี |
tools
|
ระบบบิลด์จะตรวจสอบว่ามีการสร้างข้อกำหนดเบื้องต้นเหล่านี้ก่อนที่จะเรียกใช้คำสั่ง genrule
โดยจะสร้างโดยใช้การกำหนดค่า hostเนื่องจากเครื่องมือเหล่านี้จะดำเนินการเป็นส่วนหนึ่งของบิลด์ คุณดูเส้นทางของ
|
test_suite
test_suite(name, compatible_with, deprecation, distribs, features, licenses, restricted_to, tags, target_compatible_with, testonly, tests, visibility)
test_suite จะกำหนดชุดการทดสอบที่ถือว่า "มีประโยชน์" ต่อมนุษย์ ซึ่งจะช่วยให้โปรเจ็กต์กำหนดชุดการทดสอบได้ เช่น "การทดสอบที่คุณต้องเรียกใช้ก่อนเช็คอิน" "การทดสอบความเครียดของโปรเจ็กต์" หรือ "การทดสอบขนาดเล็กทั้งหมด" คำสั่ง blaze test จะพิจารณาการจัดระเบียบประเภทนี้
สำหรับการเรียกใช้ เช่น blaze test //some/test:suite ก่อนอื่น Blaze จะ
แจงเป้าหมายการทดสอบทั้งหมดที่รวมอยู่โดยอ้อมในเป้าหมาย //some/test:suite (เรา
เรียกขั้นตอนนี้ว่า "การขยายชุดทดสอบ") จากนั้น Blaze จะสร้างและทดสอบเป้าหมายเหล่านั้น
ตัวอย่าง
ชุดทดสอบเพื่อเรียกใช้การทดสอบขนาดเล็กทั้งหมดในแพ็กเกจปัจจุบัน
test_suite(
name = "small_tests",
tags = ["small"],
)
ชุดทดสอบที่เรียกใช้ชุดการทดสอบที่ระบุ
test_suite(
name = "smoke_tests",
tests = [
"system_unittest",
"public_api_unittest",
],
)
ชุดทดสอบเพื่อเรียกใช้การทดสอบทั้งหมดในแพ็กเกจปัจจุบันซึ่งไม่ไม่เสถียร
test_suite(
name = "non_flaky_test",
tags = ["-flaky"],
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
tags
|
แท็กที่ขึ้นต้นด้วยอักขระ "-" จะถือเป็นแท็กเชิงลบ อักขระ "-" ที่อยู่ก่อนหน้าจะไม่ถือเป็นส่วนหนึ่งของแท็ก ดังนั้นแท็กชุด "-small" จะตรงกับขนาด "small" ของการทดสอบ แท็กอื่นๆ ทั้งหมดจะถือเป็น แท็กเชิงบวก หากต้องการให้แท็กเชิงบวกชัดเจนยิ่งขึ้น คุณอาจเริ่มแท็กด้วยอักขระ "+" ซึ่งจะไม่ได้รับการประเมินเป็นส่วนหนึ่งของข้อความของแท็ก เพียงแต่ช่วยให้อ่านความแตกต่างระหว่างค่าบวกกับค่าลบได้ง่ายขึ้น ระบบจะรวมเฉพาะกฎการทดสอบที่ตรงกับแท็กเชิงบวกทั้งหมดและแท็กเชิงลบทั้งหมด ไว้ในชุดการทดสอบ โปรดทราบว่าการดำเนินการนี้ไม่ได้หมายความว่าระบบจะข้ามการตรวจสอบข้อผิดพลาด สำหรับการอ้างอิงในการทดสอบที่กรองออกไป การอ้างอิงในการทดสอบที่ข้าม ยังคงต้องถูกต้อง (เช่น ไม่ถูกบล็อกโดยข้อจำกัดด้านการมองเห็น)
โปรดทราบว่า
หากต้องการ |
tests
|
เรายอมรับ
หากไม่ได้ระบุหรือปล่อยให้แอตทริบิวต์ |