เนื้อหา
พัสดุ
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
ฟังก์ชันนี้จะประกาศข้อมูลเมตาที่ใช้กับทุกกฎในแพ็กเกจ โดยใช้มากที่สุดเพียงครั้งเดียวในแพ็กเกจ (ไฟล์ BUILD)
สำหรับคู่ที่ประกาศว่ามีการใช้ข้อมูลเมตากับทุกกฎในทั้งที่เก็บ ให้ใช้ฟังก์ชัน repo()
ในไฟล์ REPO.bazel
ที่รูทของที่เก็บ
ฟังก์ชัน repo()
ใช้อาร์กิวเมนต์เดียวกับ package()
ควรเรียกใช้ฟังก์ชันpackage() หลังคำสั่งload() ทั้งหมดที่ด้านบนของไฟล์ ก่อนกฎใดๆ
อาร์กิวเมนต์
แอตทริบิวต์ | คำอธิบาย |
---|---|
default_applicable_licenses |
ชื่อแทนของ |
default_visibility |
รายการป้ายกำกับ ค่าเริ่มต้นคือ การเปิดเผยเริ่มต้นของกฎในแพ็กเกจนี้ ทุกกฎในแพ็กเกจนี้มีระดับการเข้าถึงที่ระบุในแอตทริบิวต์นี้ เว้นแต่จะระบุไว้เป็นอย่างอื่นในแอตทริบิวต์ |
default_deprecation |
สตริง ค่าเริ่มต้นคือ ตั้งค่าข้อความ
|
default_package_metadata |
รายการป้ายกำกับ ค่าเริ่มต้นคือ กำหนดรายการเป้าหมายข้อมูลเมตาเริ่มต้นที่ใช้กับเป้าหมายอื่นๆ ทั้งหมดในแพ็กเกจ โดยทั่วไปเป้าหมายเหล่านี้จะเกี่ยวข้องกับการประกาศแพ็กเกจและใบอนุญาต OSS ดูตัวอย่างได้ที่ rules_license |
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) ระบบจะละเว้นไฟล์ของไดเรกทอรีประเภทจากผลการค้นหา (ค่าเริ่มต้นคือ 1)
หากตั้งค่าอาร์กิวเมนต์ allow_empty
เป็น False
ฟังก์ชัน glob
จะแสดงข้อผิดพลาดหากผลลัพธ์จะเป็นรายการที่ว่างเปล่า
มีข้อจำกัดและคำเตือนที่สำคัญหลายประการดังนี้
-
เนื่องจาก
glob()
ทำงานระหว่างการประเมินไฟล์ BUILD ดังนั้นglob()
จะจับคู่ไฟล์ในโครงสร้างต้นทางเท่านั้น โดยไม่สร้างไฟล์ หากคุณกำลังสร้างเป้าหมายที่ต้องใช้ทั้งไฟล์ต้นฉบับและไฟล์ที่สร้างขึ้น คุณจะต้องเพิ่มรายการที่ชัดเจนของไฟล์ที่สร้างขึ้นลงใน 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
จะไม่ตรงกัน ไดเรกทอรีที่ซ่อนอยู่จะมีการจับคู่ในลักษณะเดียวกัน ไดเรกทอรีที่ซ่อนอยู่อาจมีไฟล์ที่ไม่จำเป็นเป็นอินพุต และอาจเพิ่มจำนวนไฟล์ globbs และการใช้หน่วยความจำโดยไม่จำเป็น หากต้องการยกเว้นไดเรกทอรีที่ซ่อน ให้เพิ่มไดเรกทอรีเหล่านั้นในอาร์กิวเมนต์รายการ "ยกเว้น" -
ไวลด์การ์ด "**" มีตัวพิมพ์แบบมุมเดียว: รูปแบบ
"**"
ไม่ตรงกับเส้นทางไดเรกทอรีของแพ็กเกจ กล่าวคือglob(["**"], exclude_directories = 0)
จะจับคู่ไฟล์และไดเรกทอรีทั้งหมดภายในไดเรกทอรีของแพ็กเกจปัจจุบันอย่างเคร่งครัด (แต่จะไม่เข้าไปในไดเรกทอรีของแพ็กเกจย่อย โปรดดูหมายเหตุก่อนหน้านี้ได้)
โดยทั่วไป คุณควรลองใส่ส่วนขยายที่เหมาะสม (เช่น *.html) แทนการใช้ "*" เปล่าสำหรับรูปแบบ glob ชื่อที่ชัดเจนมากกว่าจะเป็นการบันทึกตัวเอง และทำให้แน่ใจว่าคุณจะไม่จับคู่ไฟล์ข้อมูลสำรอง หรือ 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 และแพ็กเกจมีไฟล์ที่ตรงกัน 3 ไฟล์ ได้แก่ 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 แบบบรรทัดคำสั่ง
คุณใช้ตัวเลือกนี้ได้ เช่น เพื่อกำหนดทรัพยากร Dependency เฉพาะแพลตฟอร์มหรือเพื่อฝังทรัพยากรที่แตกต่างกัน โดยขึ้นอยู่กับว่ามีการสร้างกฎในโหมด "นักพัฒนาซอฟต์แวร์" หรือ "เผยแพร่"
การใช้งานขั้นพื้นฐานมีดังนี้
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 มี Flag และค่าจำกัดเดียวกันกับ 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'
โดยทั่วไปแล้ว เราแนะนำให้ใช้โมดูล "subpackages" ของ skylib แทนการเรียกใช้ฟังก์ชันนี้โดยตรง