เนื้อหา
พัสดุ
package(default_deprecation, default_testonly, default_visibility, features)
ฟังก์ชันนี้จะประกาศข้อมูลเมตาที่ใช้กับกฎที่ตามมาทุกกฎใน ใหม่ โดยใช้มากที่สุดเพียงครั้งเดียวในแพ็กเกจ (ไฟล์ BUILD)
ควรเรียกฟังก์ชันแพ็กเกจ() หลังคำสั่ง remove() ทั้งหมดที่ด้านบนสุดของฟังก์ชัน ก่อนกฎใดๆ
อาร์กิวเมนต์
| แอตทริบิวต์ | คำอธิบาย |
|---|---|
default_visibility |
การเปิดเผยเริ่มต้นของกฎในแพ็กเกจนี้ ทุกกฎในแพ็กเกจนี้มีระดับการเข้าถึงที่ระบุไว้ใน
เว้นแต่จะระบุไว้เป็นอย่างอื่นใน |
default_deprecation |
ตั้งค่าเริ่มต้น
|
default_testonly |
ตั้งค่าเริ่มต้น
ในแพ็กเกจที่ต่ำกว่า |
features |
ตั้งค่าแฟล็กต่างๆ ที่ส่งผลต่อความหมายของไฟล์ BUILD นี้ ผู้ที่ทำงานเกี่ยวกับระบบบิลด์จะใช้ฟีเจอร์นี้เป็นหลัก ติดแท็กแพ็กเกจที่ต้องมีการจัดการพิเศษ อย่าใช้รายการนี้เว้นแต่ ขออย่างชัดแจ้งจากผู้ที่ทำงานในระบบบิลด์ |
ตัวอย่าง
ประกาศด้านล่างระบุว่ากฎในแพ็กเกจนี้ แสดงต่อสมาชิกแพ็กเกจเท่านั้น กลุ่ม//foo:target ประกาศระดับการเข้าถึงแต่ละรายการ
ในกฎ (หากมี) จะลบล้างข้อกำหนดนี้
package(default_visibility = ["//foo:target"])
package_group
package_group(name, packages, includes)
ฟังก์ชันนี้จะกำหนดชุดของแพ็กเกจ
แล้วเชื่อมโยงป้ายกำกับกับชุด สามารถอ้างอิงป้ายกำกับได้ใน
visibility
กลุ่มแพ็กเกจใช้สำหรับการควบคุมระดับการเข้าถึงเป็นหลัก วิดีโอที่เผยแพร่ต่อสาธารณะ สามารถอ้างอิงเป้าหมายจากทุกแพ็กเกจในโครงสร้างต้นทาง วิดีโอส่วนตัว เป้าหมายที่แสดงสามารถอ้างอิงได้ภายในแพ็กเกจของตนเองเท่านั้น (ไม่ใช่แพ็กเกจย่อย) ระหว่างจุดสูงสุดเหล่านี้ เป้าหมายอาจอนุญาตให้เข้าถึงแพ็กเกจของตนเองและ แพ็กเกจที่อธิบายโดยกลุ่มแพ็กเกจอย่างน้อย 1 กลุ่ม สำหรับรายละเอียดเพิ่มเติม เกี่ยวกับระบบการมองเห็น การเปิดเผย
แพ็กเกจที่กำหนดจะถือว่าอยู่ในกลุ่มหากแพ็กเกจนั้นตรงกับ
packages หรือมีอยู่ในแอตทริบิวต์อื่นๆ แล้ว
กลุ่มแพ็กเกจที่กล่าวถึงในแอตทริบิวต์ includes
ในทางเทคนิคกลุ่มแพ็กเกจเป็นเป้าหมาย แต่ไม่ได้สร้างขึ้นโดยกฎ และ ไม่มีการป้องกันการแสดงผลใดๆ
อาร์กิวเมนต์
| แอตทริบิวต์ | คำอธิบาย |
|---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
packages |
รายการข้อมูลจำเพาะของแพ็กเกจอย่างน้อย 1 รายการ สตริงข้อกำหนดแพ็กเกจแต่ละรายการอาจมีค่าใดค่าหนึ่งต่อไปนี้ แบบฟอร์ม:
นอกจากนี้ ข้อกำหนดเฉพาะของแพ็กเกจ 2 ประเภทแรกยังอาจ
นำหน้าด้วย กลุ่มแพ็กเกจมีแพ็กเกจที่ตรงกับรายการแพ็กเกจอย่างน้อย 1 รายการ
ข้อกำหนดที่เป็นบวกและไม่มีข้อมูลจำเพาะด้านลบ
เช่น ค่า นอกจากการแสดงต่อสาธารณะแล้ว ไม่มีวิธีระบุ แพ็กเกจที่อยู่นอกที่เก็บปัจจุบัน หากแอตทริบิวต์นี้ขาดหายไป จะเหมือนกับการตั้งค่าเป็น
รายการที่ว่างเปล่า ซึ่งเหมือนกับการตั้งค่าไปยังรายการที่มี
เฉพาะ หมายเหตุ: ก่อนที่จะใช้ Bazel 6.0 ข้อกำหนดเฉพาะ หมายเหตุ: เวอร์ชันก่อนหน้า Bazel 6.0 เมื่อแอตทริบิวต์นี้เปลี่ยนเป็นแบบอนุกรม
ส่วนของ |
includes |
กลุ่มแพ็กเกจอื่นๆ ที่รวมอยู่ในแพ็กเกจนี้ ป้ายกำกับในแอตทริบิวต์นี้ต้องอ้างอิงถึงกลุ่มแพ็กเกจอื่นๆ
ระบบจะนำแพ็กเกจในกลุ่มแพ็กเกจที่อ้างอิงไปใช้เป็นส่วนหนึ่งของแพ็กเกจ
กลุ่มแพ็กเกจ นี่เป็นทรานซิชัน — ถ้ากลุ่มแพ็กเกจ
เมื่อใช้ร่วมกับข้อกำหนดของแพ็กเกจที่ถูกปฏิเสธ โปรดทราบว่า ชุดแพ็กเกจของแต่ละกลุ่มจะได้รับการคำนวณแยกกันก่อนและ ผลลัพธ์จะรวมกัน ซึ่งหมายความว่า ข้อกำหนดในกลุ่มหนึ่งจะไม่มีผลต่อข้อกำหนดใน ในอีกกลุ่มหนึ่ง |
ตัวอย่าง
การประกาศ package_group ต่อไปนี้ระบุ
กลุ่มแพ็กเกจชื่อ "เขตร้อน" ที่มีผลไม้เมืองร้อน
package_group(
name = "tropical",
packages = [
"//fruits/mango",
"//fruits/orange",
"//fruits/papaya/...",
],
)
ประกาศต่อไปนี้จะระบุกลุ่มแพ็กเกจของ แอปพลิเคชัน:
package_group(
name = "fooapp",
includes = [
":controller",
":model",
":view",
],
)
package_group(
name = "model",
packages = ["//fooapp/database"],
)
package_group(
name = "view",
packages = [
"//fooapp/swingui",
"//fooapp/webui",
],
)
package_group(
name = "controller",
packages = ["//fooapp/algorithm"],
)
exports_files
exports_files([label, ...], visibility, licenses)
exports_files() ระบุรายการไฟล์ที่เป็นของ
แพ็กเกจนี้ที่ส่งออกไปยังแพ็กเกจอื่นๆ
ไฟล์ BUILD สำหรับแพ็กเกจอาจอ้างถึงไฟล์ต้นฉบับโดยตรงเท่านั้น
ไปยังแพ็กเกจอื่น หากมีการส่งออกอย่างชัดเจนด้วย
คำสั่ง exports_files() อ่านเพิ่มเติมเกี่ยวกับ
การเปิดเผยไฟล์
ตามลักษณะการทำงานเดิม ระบบจะส่งออกไฟล์ที่ระบุว่าเป็นอินพุตของกฎด้วย
ด้วยระดับการมองเห็นเริ่มต้นจนถึงธง
--incompatible_no_implicit_file_export
กลับด้าน อย่างไรก็ตาม คุณไม่ควรพึ่งพาพฤติกรรมนี้โดยทันที
ย้ายออกจาก
อาร์กิวเมนต์
อาร์กิวเมนต์คือรายการชื่อไฟล์ภายในแพ็กเกจปัจจุบัน ต
สามารถระบุการประกาศระดับการเข้าถึงได้อีกด้วย ในกรณีนี้ ไฟล์จะ
แสดงต่อเป้าหมายที่ระบุ หากไม่ได้ระบุการเปิดเผยไว้ ไฟล์
จะแสดงต่อทุกแพ็กเกจ แม้ว่าระดับการเข้าถึงเริ่มต้นของแพ็กเกจจะเป็น
ที่ระบุไว้ใน package
ใบอนุญาต
ได้ด้วย
ตัวอย่าง
ตัวอย่างต่อไปนี้จะส่งออก golden.txt,
จากแพ็กเกจ test_data เพื่อให้
แพ็กเกจอาจใช้งานผลิตภัณฑ์ดังกล่าวได้ ตัวอย่างเช่น ในแอตทริบิวต์ data
ของการทดสอบ
# from //test_data/BUILD exports_files(["golden.txt"])
โลก
glob(include, exclude=[], exclude_directories=1, allow_empty=True)
Glob เป็นฟังก์ชันตัวช่วยที่จะค้นหาไฟล์ทั้งหมดที่ตรงกับรูปแบบเส้นทางบางรายการ และแสดงผลรายการเส้นทางใหม่ ที่เปลี่ยนแปลงและจัดเรียงได้ Glob จะค้นหาเฉพาะไฟล์ ในแพ็กเกจของตัวเอง และค้นหาเฉพาะไฟล์ต้นฉบับ (ไม่ใช่ไฟล์ที่สร้างขึ้นหรือ เป้าหมายอื่นๆ)
ป้ายกำกับของไฟล์แหล่งที่มาจะรวมอยู่ในผลลัพธ์หากไฟล์เกี่ยวข้องกับแพ็กเกจ
เส้นทางตรงกับรูปแบบ include ใดๆ และไม่มี
exclude รูปแบบ
รายการ include และ exclude มีรูปแบบเส้นทาง
ที่เกี่ยวข้องกับแพ็กเกจปัจจุบัน ทุกรูปแบบอาจประกอบด้วย 1 รูปแบบหรือ
กลุ่มเส้นทางเพิ่มเติม เช่นเคยเมื่อใช้เส้นทาง Unix กลุ่มเหล่านี้จะคั่นด้วย
/ กลุ่มอาจมีไวลด์การ์ด * ซึ่งตรงกันดังนี้
สตริงย่อยทั้งหมดในส่วนของเส้นทาง (รวมถึงสตริงย่อยที่ว่างเปล่า) ยกเว้น
ตัวคั่นไดเรกทอรี / ไวลด์การ์ดนี้ใช้ได้หลายครั้ง
ภายในกลุ่มเส้นทางเดียว นอกจากนี้ ไวลด์การ์ด ** ยังจับคู่ได้
กลุ่มเส้นทางที่สมบูรณ์ตั้งแต่ 0 รายการขึ้นไป แต่ต้องได้รับการประกาศเป็นแบบสแตนด์อโลน
ส่วนเส้นทาง
foo/bar.txtตรงกับไฟล์foo/bar.txtทุกประการ ในแพ็กเกจนี้foo/*.txtตรงกับทุกไฟล์ในไดเรกทอรีfoo/หากไฟล์ลงท้ายด้วย.txt(เว้นแต่foo/เป็นแพ็กเกจย่อย)foo/a*.htm*ตรงกับทุกไฟล์ในfoo/ที่ขึ้นต้นด้วยaและมีสตริงที่กำหนดเอง ( ว่างเปล่า) ตามด้วย.htmและลงท้ายด้วยสตริงที่กำหนดเองอีกสตริงหนึ่ง เช่นfoo/axx.htmและfoo/a.htmlหรือfoo/axxx.html**/a.txtตรงกับทุกa.txtไฟล์ในทุก ไดเรกทอรีย่อยของแพ็กเกจนี้**/bar/**/*.txtตรงกับทุก.txtไฟล์ในทุก ไดเรกทอรีย่อยของแพ็กเกจนี้ หากอย่างน้อย 1 ไดเรกทอรีในเส้นทางผลลัพธ์คือ ที่เรียกว่าbarเช่นxxx/bar/yyy/zzz/a.txtหรือbar/a.txt(อย่าลืมว่า**จะจับคู่กับ 0 ด้วย กลุ่ม) หรือbar/zzz/a.txt**ตรงกับทุกไฟล์ในทุกไดเรกทอรีย่อยของส่วนนี้ พัสดุfoo**/a.txtเป็นรูปแบบที่ไม่ถูกต้อง เนื่องจาก**ต้อง ยืนหยัดอยู่ได้ในตัวเองเป็นกลุ่ม
หากเปิดใช้อาร์กิวเมนต์ exclude_directories (ตั้งค่าเป็น 1) ไฟล์ของ
type ไดเรกทอรีจะไม่ปรากฏในผลลัพธ์ (ค่าเริ่มต้น 1)
หากตั้งค่าอาร์กิวเมนต์ allow_empty เป็น False ค่า
ฟังก์ชัน glob จะแสดงข้อผิดพลาดหากผลลัพธ์จะเป็น
รายการที่ว่างเปล่า
มีข้อจำกัดและคำเตือนที่สำคัญหลายประการดังนี้
-
เนื่องจาก
glob()ทำงานระหว่างการประเมินไฟล์ BUILDglob()จะจับคู่ไฟล์ในโครงสร้างแหล่งที่มาเท่านั้น โดยไม่จับคู่กับ ไฟล์ที่สร้างขึ้น ถ้าคุณสร้างเป้าหมายที่ต้องใช้ทั้ง 2 อย่าง ไฟล์ต้นฉบับและไฟล์ที่สร้างขึ้น คุณต้องต่อท้ายรายการที่ชัดเจนของไฟล์ที่สร้าง ไฟล์เหล่านั้นไปยัง glob ดูตัวอย่าง ด้านล่างกับ:mylibและ:gen_java_srcs -
หากกฎมีชื่อเหมือนกับไฟล์แหล่งที่มาที่ตรงกัน กฎจะ "เงา" ไฟล์
หากต้องการทำความเข้าใจเกี่ยวกับเรื่องนี้ โปรดทราบว่า
glob()จะแสดงผลรายการ ดังนั้นการใช้glob()ในกฎอื่นๆ (เช่นsrcs = glob(["*.cc"])) จะมีผลเหมือนกับการแสดง เส้นทางที่ตรงกันอย่างชัดเจน ตัวอย่างเช่นglob()ให้ผลตอบแทน["Foo.java", "bar/Baz.java"]แต่ก็มีกฎในส่วน แพ็กเกจชื่อ "Foo.java" (ซึ่งได้รับอนุญาต แม้ว่า Bazel จะเตือนเรื่องนี้แล้วก็ตาม) ผู้ใช้glob()จะใช้ "Foo.java" กฎ (เอาต์พุต) แทน "Foo.java" โปรดดู GitHub ปัญหา #10395 สำหรับรายละเอียดเพิ่มเติม - Globs อาจจับคู่ไฟล์ในไดเรกทอรีย่อย และชื่อไดเรกทอรีย่อย อาจใช้ไวลด์การ์ด อย่างไรก็ตาม...
-
ไม่อนุญาตให้ใช้ป้ายกำกับข้ามพรมแดนพัสดุและ glob ไม่ตรงกับไฟล์ในแพ็กเกจย่อย
เช่น นิพจน์ glob
**/*.ccในแพ็กเกจxไม่รวมx/y/z.ccหากx/yมีลักษณะเป็นแพ็กเกจ (อาจเป็นx/y/BUILDหรือที่อื่นในเส้นทางแพ็กเกจ) ช่วงเวลานี้ หมายความว่าผลลัพธ์ของการแสดงออกของ glob ขึ้นอยู่กับ การมีอยู่ของไฟล์ BUILD กล่าวคือ นิพจน์ glob เดียวกันจะ รวมx/y/z.ccถ้าไม่มีแพ็กเกจชื่อx/yหรือมีการทำเครื่องหมายว่าลบแล้วโดยใช้ --deleted_packages แจ้ง - ข้อจำกัดข้างต้นมีผลกับนิพจน์ของ glob ทั้งหมด ไม่ว่าจะใช้ไวลด์การ์ดใด
-
ไฟล์ที่ซ่อนอยู่ซึ่งมีชื่อไฟล์ขึ้นต้นด้วย
.จะถูกจับคู่อย่างสมบูรณ์โดย ทั้งไวลด์การ์ด**และ*หากต้องการจับคู่ไฟล์ที่ซ่อนอยู่ ที่มีรูปแบบแบบผสม รูปแบบของคุณจะต้องขึ้นต้นด้วย.ตัวอย่างเช่น*และ.*.txtจะตรงกับ.foo.txtแต่เป็น*.txtจะไม่ได้ผล ไดเรกทอรีที่ซ่อนอยู่จะมีการจับคู่ในลักษณะเดียวกัน ไดเรกทอรีที่ซ่อนอยู่ อาจรวมไฟล์ที่ไม่จำเป็นต้องเป็นอินพุต และสามารถเพิ่ม จำนวนไฟล์ globbed และหน่วยความจำที่ไม่จำเป็น เพื่อยกเว้น ไดเรกทอรีที่ซ่อนอยู่ ให้เพิ่มไดเรกทอรีเหล่านั้นในส่วน "ยกเว้น" แสดงอาร์กิวเมนต์ -
"**" ไวลด์การ์ดมีตัวพิมพ์แบบมุมเดียว: ลาย
"**"ไม่ตรงกับเส้นทางไดเรกทอรีของแพ็กเกจ นั่นคือ พูดว่าglob(["**"], exclude_directories = 0)ตรงกับไฟล์ทั้งหมด และไดเรกทอรีโดยตรงภายใต้ไดเรกทอรีของแพ็กเกจปัจจุบัน (แต่แน่นอนว่าไม่ได้เข้าไปในไดเรกทอรีของแพ็กเกจย่อย โปรดดู เกี่ยวกับเรื่องนี้)
โดยทั่วไปคุณควรพยายามแสดงนามสกุลที่เหมาะสม (เช่น *.html) แทนที่จะใช้ "*" เปล่าสำหรับรูปแบบลูกโลก ชื่อที่ชัดเจนมาก เป็นการบันทึกด้วยตนเอง และทำให้แน่ใจว่าคุณไม่ได้จับคู่ข้อมูลสำรองโดยไม่ตั้งใจ หรือ emacs/vi/... บันทึกไฟล์อัตโนมัติ
เมื่อเขียนกฎในการสร้าง คุณสามารถแจกแจงองค์ประกอบภาพโลกได้ ช่วงเวลานี้ เปิดใช้การสร้างกฎสำหรับแต่ละอินพุต เป็นต้น โปรดดู ตัวอย่าง glob ที่ขยายที่ด้านล่าง
ตัวอย่างของ Glob
สร้างไลบรารี Java ที่สร้างขึ้นจากไฟล์ Java ทั้งหมดในไดเรกทอรีนี้
และไฟล์ทั้งหมดที่สร้างโดยกฎ :gen_java_srcs
java_library(
name = "mylib",
srcs = glob(["*.java"]) + [":gen_java_srcs"],
deps = "...",
)
genrule(
name = "gen_java_srcs",
outs = [
"Foo.java",
"Bar.java",
],
...
)
รวมไฟล์ txt ทั้งหมดในไดเรกทอรี testdata ยกเว้นรุ่นทดลอง.txt โปรดทราบว่าจะไม่รวมไฟล์ในไดเรกทอรีย่อยของ testdata ถ้า หากคุณต้องการให้ไฟล์เหล่านั้นรวมอยู่ด้วย ให้ใช้ glob ที่เกิดซ้ำ (**)
sh_test(
name = "mytest",
srcs = ["mytest.sh"],
data = glob(
["testdata/*.txt"],
exclude = ["testdata/experimental.txt"],
),
)
ตัวอย่างลูกโลกที่เกิดซ้ำ
ทำให้การทดสอบขึ้นอยู่กับไฟล์ txt ทั้งหมดในไดเรกทอรี testdata และ ไดเรกทอรีย่อย (และไดเรกทอรีย่อย เป็นต้น) ระบบจะไม่สนใจไดเรกทอรีย่อยที่มีไฟล์ BUILD (ดูข้อจำกัด และคำเตือนข้างต้น)
sh_test(
name = "mytest",
srcs = ["mytest.sh"],
data = glob(["testdata/**/*.txt"]),
)
สร้างไลบรารีที่สร้างขึ้นจากไฟล์ Java ทั้งหมดในไดเรกทอรีนี้และทั้งหมด ไดเรกทอรีย่อย ยกเว้นไดเรกทอรีที่เส้นทางมีไดเรกทอรีที่ชื่อการทดสอบ ควรหลีกเลี่ยงรูปแบบนี้หากเป็นไปได้ เนื่องจากอาจลดการสร้าง ส่วนเพิ่ม ดังนั้นจึงเพิ่มเวลาในการสร้าง
java_library(
name = "mylib",
srcs = glob(
["**/*.java"],
exclude = ["**/testing/**"],
),
)
ตัวอย่างของ Glob แบบขยาย
สร้าง Genrule แต่ละรายการสำหรับ *_test.cc ในไดเรกทอรีปัจจุบัน ที่นับจำนวนบรรทัดในไฟล์
# Conveniently, the build language supports list comprehensions.
[genrule(
name = "count_lines_" + f[:-3], # strip ".cc"
srcs = [f],
outs = ["%s-linecount.txt" % f[:-3]],
cmd = "wc -l $< >$@",
) for f in glob(["*_test.cc"])]
หากไฟล์ BUILD ด้านบนอยู่ในแพ็กเกจ //foo และแพ็กเกจมี
ไฟล์ที่ตรงกัน, a_test.cc, b_test.cc และ c_test.cc จากนั้นกำลังทำงาน
bazel query '//foo:all' จะแสดงรายการกฎทั้งหมดที่สร้างขึ้น:
$ bazel query '//foo:all' | sort //foo:count_lines_a_test //foo:count_lines_b_test //foo:count_lines_c_test
เลือก
select(
{conditionA: valuesA, conditionB: valuesB, ...},
no_match_error = "custom message"
)
select() คือฟังก์ชันตัวช่วยที่สร้างแอตทริบิวต์กฎ
configurable
สามารถใช้แทนที่ด้านขวามือของ
เกือบ
การกำหนดแอตทริบิวต์ทั้งหมด ดังนั้นค่าจะขึ้นอยู่กับแฟล็ก Bazel ในบรรทัดคำสั่ง
ตัวอย่างเช่น คุณสามารถใช้ค่านี้เพื่อกำหนดการอ้างอิงเฉพาะแพลตฟอร์ม หรือ
ฝังทรัพยากรที่แตกต่างกัน โดยขึ้นอยู่กับว่ามีการสร้างกฎใน "นักพัฒนาซอฟต์แวร์" หรือไม่
เทียบกับ "เปิดตัว"
การใช้งานขั้นพื้นฐานมีดังนี้
sh_binary(
name = "mytarget",
srcs = select({
":conditionA": ["mytarget_a.sh"],
":conditionB": ["mytarget_b.sh"],
"//conditions:default": ["mytarget_default.sh"]
})
)
ซึ่งทำให้แอตทริบิวต์ srcs ของ
sh_binary ที่กำหนดค่าได้โดยแทนที่ป้ายกำกับปกติ
การกำหนดรายการด้วยการเรียก select ที่แมป
เงื่อนไขการกำหนดค่าให้เป็นค่าที่ตรงกัน แต่ละเงื่อนไขจะเป็นป้ายกำกับ
การอ้างอิงถึง
config_setting หรือ
constraint_value,
ซึ่ง "ตรง" หากการกำหนดค่าของเป้าหมายตรงกับชุดของ
ค่าของ mytarget#srcs จะกลายเป็นค่าใดก็ได้
รายการป้ายกำกับตรงกับการเรียกใช้ปัจจุบัน
หมายเหตุ:
- เลือกเงื่อนไขเพียง 1 รายการในการเรียกใช้
- หากเงื่อนไขหลายข้อตรงกัน และข้อหนึ่งเป็นความเชี่ยวชาญพิเศษของอีกฝ่าย ความเชี่ยวชาญพิเศษจะมีความสำคัญเหนือกว่า เงื่อนไข B ถือว่าเป็นเงื่อนไข ความเชี่ยวชาญพิเศษของเงื่อนไข A หาก B มีแฟล็กและข้อจำกัดเดียวกันทั้งหมด เป็นค่า A บวกค่า Flag หรือค่าจำกัดเพิ่มเติมบางส่วน ยัง หมายความว่าความละเอียดของความเชี่ยวชาญพิเศษไม่ได้ออกแบบมาเพื่อสร้างการสั่งซื้อเป็น แสดงในตัวอย่างที่ 2 ด้านล่าง
- หากเงื่อนไขหลายข้อตรงกัน แต่มีข้อหนึ่งไม่ใช่ความเชี่ยวชาญพิเศษของทุก อื่นๆ Bazel ล้มเหลวโดยมีข้อผิดพลาด ยกเว้นกรณีที่เงื่อนไขทั้งหมดแก้ไขเป็นค่าเดียวกัน
- ป้ายกำกับปลอมพิเศษ
//conditions:defaultคือ จะถือว่าตรงกันหากไม่มีเงื่อนไขอื่นๆ ที่ตรงกัน หากเงื่อนไขนี้ ไม่แสดง ต้องจับคู่กฎอื่นๆ เพื่อหลีกเลี่ยงข้อผิดพลาด selectสามารถฝังภายในที่มีขนาดใหญ่กว่า การกำหนดแอตทริบิวต์ ดังนั้นsrcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...})และsrcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})จึงเป็นนิพจน์ที่ถูกต้องselectใช้ได้กับแอตทริบิวต์ส่วนใหญ่ แต่ไม่ใช่ทั้งหมด ใช้ร่วมกันไม่ได้ มีการทำเครื่องหมายnonconfigurableในเอกสารประกอบแพ็กเกจย่อย
subpackages(include, exclude=[], allow_empty=True)
subpackages()เป็นฟังก์ชันตัวช่วย ซึ่งคล้ายกับglob()ซึ่งแสดงแพ็กเกจย่อยแทนที่จะเป็นไฟล์และไดเรกทอรี โดยใช้ รูปแบบเส้นทางเป็นglob()และสามารถจับคู่แพ็กเกจย่อยที่เป็น องค์ประกอบสืบทอดโดยตรงของไฟล์ BUILD ที่กำลังโหลด ดู glob สำหรับคำอธิบายโดยละเอียดและตัวอย่างการรวมและ ยกเว้นรูปแบบผลลัพธ์ของแพ็กเกจย่อยที่แสดงผลจะเรียงตามลำดับและมี เส้นทางที่สัมพันธ์กับแพ็กเกจการโหลดปัจจุบันที่ตรงกับรูปแบบที่ระบุใน
includeไม่ใช่ในexcludeตัวอย่าง
ตัวอย่างต่อไปนี้แสดงแพ็กเกจย่อยโดยตรงทั้งหมดสำหรับแพ็กเกจ
foo/BUILD# The following BUILD files exist: # foo/BUILD # foo/bar/baz/BUILD # foo/sub/BUILD # foo/sub/deeper/BUILD # # In foo/BUILD a call to subs = subpackages(include = ["**"]) # results in subs == ["sub", "bar/baz"] # # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of # 'foo'
โดยทั่วไป ควรใช้แทนการเรียกใช้ฟังก์ชันนี้โดยตรง ที่ผู้ใช้ใช้ "แพ็กเกจย่อย" โมดูลของ skylib