เนื้อหา
พัสดุ
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
ฟังก์ชันนี้จะประกาศข้อมูลเมตาที่ใช้กับทุกกฎในแพ็กเกจ โดยจะใช้ได้ไม่เกิน 1 ครั้งภายในแพ็กเกจ (ไฟล์ 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 ได้
กลุ่มแพ็กเกจใช้สำหรับการควบคุมระดับการเข้าถึงเป็นหลัก เป้าหมายที่มองเห็นได้แบบสาธารณะสามารถอ้างอิงได้จากทุกแพ็กเกจในแผนผังแหล่งที่มา เป้าหมายที่มองเห็นได้แบบส่วนตัวจะอ้างอิงได้ภายในแพ็กเกจของตัวเองเท่านั้น (ไม่ใช่แพ็กเกจย่อย) ระหว่างขอบเขตทั้ง 2 นี้ เป้าหมายอาจอนุญาตให้เข้าถึงแพ็กเกจของตนเองและแพ็กเกจใดก็ได้ที่อธิบายโดยกลุ่มแพ็กเกจอย่างน้อย 1 กลุ่ม ดูคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับระบบระดับการเข้าถึงได้ที่แอตทริบิวต์ visibility
ระบบจะถือว่าแพ็กเกจหนึ่งๆ อยู่ในกลุ่มหากตรงกับแอตทริบิวต์ packages หรือมีอยู่ในกลุ่มแพ็กเกจอื่นๆ ที่ระบุไว้ในแอตทริบิวต์ includes อยู่แล้ว
กลุ่มแพ็กเกจเป็นเป้าหมายทางเทคนิค แต่ไม่ได้สร้างขึ้นโดยกฎ และไม่มีการป้องกันระดับการเข้าถึงด้วยตนเอง
อาร์กิวเมนต์
| แอตทริบิวต์ | คำอธิบาย |
|---|---|
name |
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(โปรดทราบว่า**จะจับคู่กับกลุ่มที่ไม่มีข้อมูลด้วย) หรือbar/zzz/a.txt**ตรงกับทุกไฟล์ในไดเรกทอรีย่อยทั้งหมดของแพ็กเกจนี้foo**/a.txtเป็นรูปแบบที่ไม่ถูกต้อง เนื่องจาก**ต้องเป็นส่วนที่แยกออกมาต่างหาก
หากเปิดใช้อาร์กิวเมนต์ exclude_directories (ตั้งค่าเป็น 1) ระบบจะไม่รวมไฟล์ประเภทไดเรกทอรีไว้ในผลลัพธ์ (ค่าเริ่มต้นคือ 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 - Glob อาจตรงกับไฟล์ในไดเรกทอรีย่อย และชื่อไดเรกทอรีย่อยอาจเป็นไวลด์การ์ด อย่างไรก็ตาม...
-
ป้ายกำกับไม่ได้รับอนุญาตให้ข้ามขอบเขตแพ็กเกจ และ 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จะไม่ตรง ไดเรกทอรีที่ซ่อนอยู่จะจับคู่ในลักษณะเดียวกันด้วย ไดเรกทอรีที่ซ่อนอยู่อาจมีไฟล์ที่ไม่จำเป็นต้องใช้เป็นอินพุต และอาจเพิ่มจำนวนไฟล์ที่รวมกันโดยไม่จำเป็นและการใช้หน่วยความจำ หากต้องการยกเว้นไดเรกทอรีที่ซ่อนอยู่ ให้เพิ่มไดเรกทอรีเหล่านั้นลงในอาร์กิวเมนต์รายการ "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 ในบรรทัดคำสั่ง
ตัวอย่างเช่น คุณสามารถใช้ฟีเจอร์นี้เพื่อกำหนดทรัพยากร 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 มีแฟล็กและค่าข้อจำกัดเหมือนกันทั้งหมดกับ 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(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 แทนการเรียกใช้ฟังก์ชันนี้โดยตรง