เนื้อหา
package
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
ฟังก์ชันนี้ประกาศข้อมูลเมตาที่มีผลกับทุกกฎในแพ็กเกจ โดยใช้ได้ไม่เกิน 1 ครั้งภายในแพ็กเกจ (ไฟล์ BUILD)
ควรเรียกใช้ฟังก์ชัน 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 |
รายการสตริง ค่าเริ่มต้นคือ รายการข้อกำหนดแพ็กเกจจำนวน 0 รายการขึ้นไป สตริงข้อกำหนดแพ็กเกจแต่ละรายการอาจมีรูปแบบใดรูปแบบหนึ่งต่อไปนี้
นอกจากนี้ ข้อกำหนดแพ็กเกจ 2 ประเภทแรกยังอาจมี
คำนำหน้าเป็น กลุ่มแพ็กเกจจะมีแพ็กเกจที่ตรงกับข้อกำหนดเชิงบวกอย่างน้อย 1 ข้อและไม่ตรงกับข้อกำหนดเชิงลบใดๆ เช่น ค่า นอกเหนือจากระดับการเข้าถึงแบบสาธารณะแล้ว ยังไม่มีวิธีระบุแพ็กเกจภายนอกที่เก็บปัจจุบันโดยตรง หากไม่มีแอตทริบิวต์นี้ การตั้งค่านี้จะเหมือนกับการตั้งค่าเป็นรายการว่าง ซึ่งเหมือนกับการตั้งค่าเป็นรายการที่มีเฉพาะ หมายเหตุ: ก่อน Bazel 6.0 ข้อกำหนด หมายเหตุ: ก่อน Bazel 6.0 เมื่อมีการซีเรียลไลซ์แอตทริบิวต์นี้เป็นส่วนหนึ่งของ |
includes |
รายการป้ายกำกับ ค่าเริ่มต้นคือ กลุ่มแพ็กเกจอื่นๆ ที่รวมอยู่ในกลุ่มนี้ ป้ายกำกับในแอตทริบิวต์นี้ต้องอ้างอิงกลุ่มแพ็กเกจอื่นๆ
ระบบจะถือว่าแพ็กเกจในกลุ่มแพ็กเกจที่อ้างอิงเป็นส่วนหนึ่งของกลุ่มแพ็กเกจนี้
ซึ่งเป็นแบบถ่ายทอด หากกลุ่มแพ็กเกจ
เมื่อใช้ร่วมกับข้อกำหนดแพ็กเกจที่ปฏิเสธ โปรดทราบว่าระบบจะคำนวณชุดแพ็กเกจสำหรับแต่ละกลุ่มแยกกันก่อน แล้วจึงรวมผลลัพธ์เข้าด้วยกัน ซึ่งหมายความว่าข้อกำหนดที่ปฏิเสธในกลุ่มหนึ่งจะไม่มีผลกับข้อกำหนดในอีกกลุ่มหนึ่ง |
ตัวอย่าง
การประกาศ package_group ต่อไปนี้จะระบุกลุ่มแพ็กเกจที่ชื่อ "tropical" ซึ่งมีผลไม้เขตร้อน
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
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เป็นรูปแบบที่ไม่ถูกต้อง เนื่องจาก**ต้อง เป็นกลุ่มแบบสแตนด์อโลน
หากเปิดใช้ (ตั้งค่าเป็น 1) อาร์กิวเมนต์ exclude_directories ระบบจะละเว้นไฟล์ประเภทไดเรกทอรีจากผลลัพธ์ (ค่าเริ่มต้นคือ 1)
หากตั้งค่าอาร์กิวเมนต์ allow_empty เป็น False ฟังก์ชัน glob จะแสดงข้อผิดพลาดหากผลลัพธ์เป็นรายการว่าง
ข้อจำกัดและคำเตือนที่สำคัญมีดังนี้
-
เนื่องจาก
glob()ทำงานระหว่างการประเมินไฟล์ BUILDglob()จึงตรงกับไฟล์ในแผนผังแหล่งที่มาเท่านั้น ไม่ใช่ไฟล์ที่สร้างขึ้น หากคุณกำลังสร้างเป้าหมายที่ต้องใช้ทั้ง ไฟล์ต้นฉบับและไฟล์ที่สร้างขึ้น คุณต้องต่อท้ายรายการไฟล์ที่สร้างขึ้นอย่างชัดแจ้งกับ 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 โดยไม่จำเป็นและการใช้หน่วยความจำ หากต้องการยกเว้น ไดเรกทอรีที่ซ่อนอยู่ ให้เพิ่มไดเรกทอรีเหล่านั้นลงในอาร์กิวเมนต์รายการ "exclude" -
ไวลด์การ์ด "**" มีกรณีพิเศษ 1 กรณีคือ รูปแบบ
"**"จะไม่ตรงกับเส้นทางไดเรกทอรีของแพ็กเกจ กล่าวคือglob(["**"], exclude_directories = 0)จะตรงกับไฟล์และไดเรกทอรีทั้งหมดที่อยู่ภายใต้ไดเรกทอรีของแพ็กเกจปัจจุบันอย่างเคร่งครัด (แต่จะไม่เข้าไปในไดเรกทอรีของแพ็กเกจย่อย โปรดดูหมายเหตุเกี่ยวกับเรื่องนี้ก่อนหน้านี้)
โดยทั่วไป คุณควรระบุส่วนขยายที่เหมาะสม (เช่น *.html) แทนการใช้ '*' เปล่าๆ สำหรับรูปแบบ glob ชื่อที่ชัดเจนมากขึ้นจะช่วยอธิบายตัวเองและช่วยให้คุณไม่จับคู่ไฟล์สำรองหรือไฟล์บันทึกอัตโนมัติของ emacs/vi/... โดยไม่ได้ตั้งใจ
เมื่อเขียนกฎบิลด์ คุณสามารถแจกแจงองค์ประกอบของ glob ได้ ซึ่งจะช่วยให้สร้างกฎแต่ละข้อสำหรับอินพุตทุกรายการได้ เช่น ดูส่วนตัวอย่าง 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 ยกเว้น experimental.txt โปรดทราบว่าระบบจะไม่รวมไฟล์ในไดเรกทอรีย่อยของ testdata หากต้องการรวมไฟล์เหล่านั้น ให้ใช้ glob แบบเรียกซ้ำ (**)
sh_test(
name = "mytest",
srcs = ["mytest.sh"],
data = glob(
["testdata/*.txt"],
exclude = ["testdata/experimental.txt"],
),
)
ตัวอย่าง Glob แบบเรียกซ้ำ
ทำให้การทดสอบขึ้นอยู่กับไฟล์ txt ทั้งหมดในไดเรกทอรี testdata และ ไดเรกทอรีย่อย (และไดเรกทอรีย่อยของไดเรกทอรีย่อย และอื่นๆ) ระบบจะละเว้นไดเรกทอรีย่อยที่มีไฟล์ BUILD (ดูข้อจำกัด และคำเตือนด้านบน)
sh_test(
name = "mytest",
srcs = ["mytest.sh"],
data = glob(["testdata/**/*.txt"]),
)
สร้างไลบรารีที่สร้างจากไฟล์ Java ทั้งหมดในไดเรกทอรีนี้และไดเรกทอรีย่อยทั้งหมด ยกเว้นไดเรกทอรีที่มีเส้นทางรวมไดเรกทอรีที่ชื่อ testing ควรหลีกเลี่ยงรูปแบบนี้หากเป็นไปได้ เนื่องจากอาจลดการเพิ่มขึ้นของบิลด์และทำให้เวลาบิลด์เพิ่มขึ้น
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() เป็นฟังก์ชันตัวช่วยที่ทำให้แอตทริบิวต์กฎ
กำหนดค่าได้.
โดยสามารถแทนที่ด้านขวาของการกำหนดแอตทริบิวต์
เกือบ
ทั้งหมดเพื่อให้ค่าขึ้นอยู่กับแฟล็ก 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 รวมถึงแฟล็กหรือค่าข้อจำกัดเพิ่มเติม ซึ่งหมายความว่าการแก้ปัญหาเงื่อนไขเฉพาะไม่ได้ออกแบบมาเพื่อสร้างลำดับตามที่แสดงในตัวอย่างที่ 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
subpackages(include, exclude=[], allow_empty=True)
subpackages()เป็นฟังก์ชันตัวช่วยที่คล้ายกับglob()ซึ่งแสดงรายการแพ็กเกจย่อยแทนไฟล์และไดเรกทอรี โดยใช้รูปแบบเส้นทางเดียวกับglob()และสามารถจับคู่แพ็กเกจย่อยใดก็ได้ที่เป็นลูกโดยตรงของไฟล์ BUILD ที่กำลังโหลด ดูคำอธิบายโดยละเอียดและตัวอย่างรูปแบบ include และ exclude ได้ที่ 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 แทนการเรียกใช้ฟังก์ชันนี้โดยตรง