เนื้อหา
พัสดุ
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
ฟังก์ชันนี้จะประกาศข้อมูลเมตาที่ใช้กับกฎทุกข้อในแพ็กเกจ ใช้ไม่เกิน 1 ครั้งภายในแพ็กเกจ (ไฟล์ BUILD)
สําหรับคู่ที่ประกาศข้อมูลเมตาที่ใช้กับกฎทุกข้อในที่เก็บทั้งหมด ให้ใช้ฟังก์ชัน repo()
ในไฟล์ REPO.bazel
ที่รูทของ repo
ฟังก์ชัน repo()
จะรับอาร์กิวเมนต์เหมือนกับ package()
ทุกประการ
ควรเรียกใช้ฟังก์ชัน package() หลังคำสั่ง load() ทั้งหมดที่ด้านบนของไฟล์ ก่อนกฎใดๆ
อาร์กิวเมนต์
แอตทริบิวต์ | คำอธิบาย |
---|---|
default_applicable_licenses |
อีเมลแทนสำหรับ |
default_visibility |
รายการป้ายกํากับ ค่าเริ่มต้นคือ ระดับการเข้าถึงเริ่มต้นของกฎในแพ็กเกจนี้ กฎทุกข้อในแพ็กเกจนี้มีระดับการเข้าถึงที่ระบุในแอตทริบิวต์นี้ เว้นแต่จะระบุไว้เป็นอย่างอื่นในแอตทริบิวต์ |
default_deprecation |
สตริง ค่าเริ่มต้นคือ ตั้งค่าข้อความ
|
default_package_metadata |
รายการป้ายกํากับ ค่าเริ่มต้นคือ ตั้งค่ารายการเป้าหมายข้อมูลเมตาเริ่มต้นที่ใช้กับเป้าหมายอื่นๆ ทั้งหมดในแพ็กเกจ โดยปกติแล้วเป้าหมายเหล่านี้เกี่ยวข้องกับแพ็กเกจ OSS และการประกาศใบอนุญาต ดูตัวอย่างได้ที่ rules_license |
default_testonly |
บูลีน ค่าเริ่มต้นคือ ตั้งค่าพร็อพเพอร์ตี้
ในแพ็กเกจที่อยู่ภายใต้ |
features |
สตริงรายการ ค่าเริ่มต้นคือ ตั้งค่า Flag ต่างๆ ที่ส่งผลต่อความหมายของไฟล์ BUILD นี้ ฟีเจอร์นี้ใช้โดยผู้ทํางานในระบบบิลด์เป็นหลักเพื่อติดแท็กแพ็กเกจที่ต้องจัดการเป็นพิเศษ อย่าใช้ตัวเลือกนี้ เว้นแต่จะได้รับคำขออย่างชัดเจนจากผู้ที่อยู่ในระบบการบิลด์ |
ตัวอย่าง
การประกาศด้านล่างจะประกาศว่ากฎในแพ็กเกจนี้จะแสดงต่อสมาชิกของกลุ่ม//foo:target
ของแพ็กเกจเท่านั้น การประกาศระดับการเข้าถึงแต่ละรายการในกฎ (หากมี) จะลบล้างข้อกำหนดนี้
package(default_visibility = ["//foo:target"])
package_group
package_group(name, packages, includes)
ฟังก์ชันนี้จะกำหนดชุด packages และเชื่อมโยงป้ายกำกับกับชุด อ้างอิงป้ายกำกับได้ในแอตทริบิวต์ visibility
กลุ่มแพ็กเกจใช้เพื่อควบคุมระดับการแชร์เป็นหลัก เป้าหมายที่แสดงแบบสาธารณะจะอ้างอิงได้จากทุกแพ็กเกจในลําดับชั้นซอร์สโค้ด เป้าหมายที่มองเห็นได้แบบส่วนตัวจะอ้างอิงได้ภายในแพ็กเกจของตัวเองเท่านั้น (ไม่ใช่แพ็กเกจย่อย) ในกรณีที่อยู่ตรงกลางระหว่าง 2 กรณีข้างต้น เป้าหมายอาจอนุญาตให้เข้าถึงแพ็กเกจของตนเอง รวมถึงแพ็กเกจที่กลุ่มแพ็กเกจอย่างน้อย 1 กลุ่มอธิบายไว้ ดูคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับระบบระดับการเข้าถึงได้ที่แอตทริบิวต์visibility
ระบบจะถือว่าแพ็กเกจหนึ่งๆ อยู่ในกลุ่มหากตรงกับแอตทริบิวต์ 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
(โปรดทราบว่า**
จะจับคู่กับกลุ่มที่ไม่มีค่าด้วย) หรือbar/zzz/a.txt
**
ตรงกับทุกไฟล์ในทุกโฟลเดอร์ย่อยของแพ็กเกจนี้foo**/a.txt
เป็นรูปแบบที่ไม่ถูกต้อง เนื่องจาก**
ต้องอยู่เดี่ยวๆ เป็นกลุ่ม
หากเปิดใช้อาร์กิวเมนต์ exclude_directories
(ตั้งค่าเป็น 1) ระบบจะไม่รวมไฟล์ของไดเรกทอรีประเภทนั้นไว้ในผลลัพธ์ (ค่าเริ่มต้นคือ 1)
หากตั้งค่าอาร์กิวเมนต์ allow_empty
เป็น False
ฟังก์ชัน glob
จะแสดงข้อผิดพลาดหากผลลัพธ์เป็นลิสต์ว่าง
ข้อจำกัดและคำเตือนที่สำคัญมีดังนี้
-
เนื่องจาก
glob()
ทำงานระหว่างการประเมินไฟล์ BUILDglob()
จึงจับคู่ไฟล์เฉพาะในลําดับชั้นซอร์สโค้ดเท่านั้น จะไม่จับคู่กับไฟล์ที่สร้างขึ้น หากกำลังสร้างเป้าหมายที่ต้องใช้ทั้งไฟล์ต้นทางและไฟล์ที่สร้างขึ้น คุณต้องเพิ่มรายการไฟล์ที่สร้างขึ้นอย่างชัดเจนต่อท้ายนิพจน์ทั่วไป ดูตัวอย่างด้านล่างที่มี:mylib
และ:gen_java_srcs
-
หากกฎมีชื่อเดียวกับไฟล์ต้นทางที่ตรงกัน กฎจะ "ซ้อนทับ" ไฟล์นั้น
โปรดทราบว่า
glob()
จะแสดงรายการเส้นทาง ดังนั้นการใช้glob()
ในแอตทริบิวต์ของกฎอื่นๆ (เช่นsrcs = glob(["*.cc"])
) จะมีผลเหมือนกับการระบุเส้นทางที่ตรงกันอย่างชัดเจน เช่น หากglob()
ให้ผลลัพธ์เป็น["Foo.java", "bar/Baz.java"]
แต่ก็มีกฎในแพ็กเกจชื่อ "Foo.java" ด้วย (ซึ่งอนุญาต แต่ Bazel จะเตือนเกี่ยวกับเรื่องนี้) ผู้ใช้glob()
จะใช้กฎ "Foo.java" (เอาต์พุตของกฎ) แทนไฟล์ "Foo.java" ดูรายละเอียดเพิ่มเติมได้ในปัญหา #10395 ของ GitHub - รูปแบบทั่วไปอาจจับคู่กับไฟล์ในไดเรกทอรีย่อย และชื่อไดเรกทอรีย่อยอาจใช้ไวลด์การ์ดได้ อย่างไรก็ตาม...
-
ป้ายกำกับต้องอยู่ภายในขอบเขตของแพ็กเกจ และ Glob จะไม่จับคู่กับไฟล์ในแพ็กเกจย่อย
ตัวอย่างเช่น นิพจน์ทั่วไป
**/*.cc
ในแพ็กเกจx
จะไม่รวมx/y/z.cc
หากx/y
เป็นแพ็กเกจ (ไม่ว่าจะเป็นx/y/BUILD
หรือที่อื่นใน package-path) ซึ่งหมายความว่าผลลัพธ์ของนิพจน์ทั่วไปจะขึ้นอยู่กับไฟล์ BUILD ที่มีอยู่ กล่าวคือ นิพจน์ทั่วไปเดียวกันจะรวมx/y/z.cc
ไว้ด้วยหากไม่มีแพ็กเกจที่ชื่อx/y
หรือมีการทําเครื่องหมายว่าลบไปแล้วโดยใช้แฟล็ก --deleted_packages - ข้อจำกัดข้างต้นมีผลกับนิพจน์ทั่วไปทั้งหมด ไม่ว่าจะใช้ไวลด์การ์ดใดก็ตาม
-
ไฟล์ที่ซ่อนซึ่งมีชื่อไฟล์ขึ้นต้นด้วย
.
จะตรงกันทั้งหมดกับทั้งไวลด์การ์ด**
และ*
หากต้องการจับคู่ไฟล์ที่ซ่อนอยู่กับรูปแบบแบบผสม รูปแบบต้องขึ้นต้นด้วย.
เช่น*
และ.*.txt
จะจับคู่กับ.foo.txt
แต่*.txt
จะไม่จับคู่ ระบบจะจับคู่ไดเรกทอรีที่ซ่อนอยู่ด้วยในลักษณะเดียวกัน ไดเรกทอรีที่ซ่อนอยู่อาจรวมไฟล์ที่ไม่จําเป็นต้องใช้เป็นอินพุต และอาจเพิ่มจํานวนไฟล์ที่รวมแบบ Glob โดยไม่จําเป็นและการใช้หน่วยความจํา หากต้องการยกเว้นไดเรกทอรีที่ซ่อนอยู่ ให้เพิ่มไดเรกทอรีนั้นลงในอาร์กิวเมนต์รายการ "exclude" -
ไวลด์การ์ด "**" มีกรณีพิเศษ 1 กรณีคือ รูปแบบ
"**"
ไม่ตรงกับเส้นทางไดเรกทอรีของแพ็กเกจ กล่าวคือglob(["**"], exclude_directories = 0)
จะจับคู่กับไฟล์และไดเรกทอรีทั้งหมดในไดเรกทอรีของแพ็กเกจปัจจุบันแบบทรานซิทีฟอย่างเคร่งครัด (แต่จะไม่เข้าไปในไดเรกทอรีของแพ็กเกจย่อย โปรดดูหมายเหตุก่อนหน้าเกี่ยวกับเรื่องนี้)
โดยทั่วไป คุณควรพยายามระบุนามสกุลที่เหมาะสม (เช่น *.html)แทนการใช้ "*" อย่างเดียวสำหรับรูปแบบทั่วไป ชื่อที่ชัดเจนยิ่งขึ้นจะทําให้ทราบรายละเอียดของไฟล์เองและช่วยให้คุณไม่จับคู่ไฟล์สํารองหรือไฟล์ที่ emacs/vi/... บันทึกโดยอัตโนมัติโดยไม่ตั้งใจ
เมื่อเขียนกฎการสร้าง คุณสามารถแจกแจงองค์ประกอบของนิพจน์ทั่วไปได้ ซึ่งช่วยให้สร้างกฎแยกต่างหากสำหรับอินพุตแต่ละรายการได้ เป็นต้น ดูส่วนตัวอย่างรูปแบบที่ขยายด้านล่าง
ตัวอย่าง 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 หากต้องการให้รวมไฟล์เหล่านั้นด้วย ให้ใช้นิพจน์ทั่วไปแบบเรียกซ้ำ (**)
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()
คือฟังก์ชันตัวช่วยที่ทำให้แอตทริบิวต์กฎกําหนดค่าได้
ซึ่งสามารถแทนที่ด้านขวาของเกือบการกําหนดค่าแอตทริบิวต์ใดๆ ค่าของแอตทริบิวต์จึงขึ้นอยู่กับ Flag ของ 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 รายการในการเรียกใช้
- หากเงื่อนไขหลายรายการตรงกันและเงื่อนไขหนึ่งเป็นเงื่อนไขเฉพาะของเงื่อนไขอื่นๆ เงื่อนไขเฉพาะจะมีลำดับความสำคัญสูงกว่า ระบบจะถือว่าเงื่อนไข ข. เป็นเงื่อนไขเฉพาะของเงื่อนไข ก. หาก ข. มีแฟล็กและค่าข้อจำกัดเหมือนกับ ก. ทั้งหมด รวมถึงมีบางแฟล็กหรือค่าข้อจำกัดเพิ่มเติม ซึ่งหมายความว่าการแก้ไขความเชี่ยวชาญไม่ได้ออกแบบมาเพื่อสร้างลําดับดังที่แสดงในตัวอย่าง 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 แทนการเรียกใช้ฟังก์ชันนี้โดยตรง