ฟังก์ชัน

เนื้อหา

พัสดุ

package(default_deprecation, default_testonly, default_visibility, features)

ฟังก์ชันนี้ประกาศข้อมูลเมตาที่ใช้กับกฎต่อๆ มาในแพ็กเกจ ซึ่งมีการใช้งานมากที่สุดเพียงครั้งเดียวภายในแพ็กเกจ (ไฟล์ BUILD)

ควรเรียกใช้ฟังก์ชัน package() ตามหลังคำสั่งload() ทั้งหมดที่ด้านบนของไฟล์ก่อนกฎใดๆ

อาร์กิวเมนต์

แอตทริบิวต์ คำอธิบาย
default_visibility

List of labels; optional

การเปิดเผยเริ่มต้นของกฎในแพ็กเกจนี้

กฎทุกกฎในแพ็กเกจนี้มีระดับการเข้าถึงที่ระบุในแอตทริบิวต์นี้ เว้นแต่จะระบุไว้เป็นอย่างอื่นในแอตทริบิวต์ visibility ของกฎ ดูข้อมูลโดยละเอียดเกี่ยวกับไวยากรณ์ของแอตทริบิวต์นี้ได้ในเอกสารประกอบเกี่ยวกับการเปิดเผย ระดับการเข้าถึงเริ่มต้นของแพ็กเกจไม่มีผลกับ exports_files ซึ่งจะแสดงต่อสาธารณะโดยค่าเริ่มต้น

default_deprecation

String; optional

ตั้งค่าข้อความ deprecation เริ่มต้นสำหรับกฎทั้งหมดในแพ็กเกจนี้

default_testonly

Boolean; optional; default is False except as noted

ตั้งค่าพร็อพเพอร์ตี้ testonly เริ่มต้นสำหรับกฎทั้งหมดในแพ็กเกจนี้

ในแพ็กเกจที่ต่ำกว่า javatests ค่าเริ่มต้นคือ 1

features

List strings; optional

ตั้งค่าแฟล็กต่างๆ ที่ส่งผลต่อความหมายของไฟล์ BUILD นี้

โดยส่วนใหญ่แล้วคนที่ทํางานในระบบบิลด์จะใช้ฟีเจอร์นี้เพื่อติดแท็กแพ็กเกจที่ต้องมีการจัดการพิเศษบางอย่าง อย่าใช้สิ่งนี้เว้นแต่จะมีผู้ขอที่ทำงานกับระบบบิลด์อย่างชัดเจน

ตัวอย่าง

การประกาศด้านล่างเป็นการประกาศว่ากฎในแพ็กเกจนี้จะปรากฏเฉพาะกับสมาชิกของกลุ่มแพ็กเกจ //foo:target เท่านั้น การประกาศระดับการเข้าถึงส่วนบุคคลในกฎ (หากมี) จะลบล้างข้อกำหนดนี้
package(default_visibility = ["//foo:target"])

package_group

package_group(name, packages, includes)

ฟังก์ชันนี้กำหนดชุดของแพ็กเกจ และเชื่อมโยงป้ายกำกับกับชุด โดยป้ายกำกับจะอ้างอิงได้ในแอตทริบิวต์ visibility

กลุ่มแพ็กเกจใช้เพื่อการควบคุมระดับการเข้าถึงเป็นหลัก สามารถอ้างอิงเป้าหมายที่แสดงแบบสาธารณะได้จากทุกแพ็กเกจในโครงสร้างแหล่งที่มา เป้าหมายที่มองเห็นได้แบบส่วนตัวจะอ้างอิงได้ภายในแพ็กเกจของตนเองเท่านั้น (ไม่ใช่แพ็กเกจย่อย) ระหว่างขอบเขตดังกล่าว เป้าหมายอาจอนุญาตให้เข้าถึงแพ็กเกจของตนเอง รวมถึงแพ็กเกจใดก็ได้ที่อธิบายไว้โดยกลุ่มแพ็กเกจอย่างน้อย 1 กลุ่ม สำหรับรายละเอียดเพิ่มเติม เกี่ยวกับระบบการมองเห็น โปรดดูที่แอตทริบิวต์ การเปิดเผย

ระบบจะถือว่าแพ็กเกจหนึ่งๆ อยู่ในกลุ่มหากตรงกับแอตทริบิวต์ packages หรือรวมอยู่ในกลุ่มแพ็กเกจอื่นๆ ที่กล่าวถึงในแอตทริบิวต์ includes อยู่แล้ว

กลุ่มแพ็กเกจเป็นเป้าหมายทางเทคนิค แต่ไม่ได้สร้างขึ้นโดยกฎ และไม่มีการป้องกันระดับการเข้าถึง

อาร์กิวเมนต์

แอตทริบิวต์ คำอธิบาย
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

packages

List of strings; optional

รายการข้อมูลจำเพาะของแพ็กเกจที่เป็น 0 รายการขึ้นไป

สตริงข้อกำหนดแพ็กเกจแต่ละรายการมีรูปแบบใดรูปแบบหนึ่งต่อไปนี้ได้

  1. ชื่อเต็มของแพ็กเกจที่ไม่มีที่เก็บ โดยขึ้นต้นด้วยเครื่องหมายทับคู่ เช่น //foo/bar จะระบุแพ็กเกจที่มีชื่อดังกล่าวและอยู่ในที่เก็บเดียวกันกับกลุ่มแพ็กเกจ
  2. เหมือนข้างต้น แต่ต่อท้าย /... เช่น //foo/... ระบุชุด //foo และแพ็กเกจย่อยทั้งหมด //... ระบุแพ็กเกจทั้งหมดในที่เก็บปัจจุบัน
  3. สตริง public หรือ private ซึ่งระบุทุกแพ็กเกจหรือไม่มีแพ็กเกจตามลำดับ (แบบฟอร์มนี้ต้องมีการตั้งค่าแฟล็ก --incompatible_package_group_has_public_syntax)

นอกจากนี้ ข้อกำหนดเฉพาะของแพ็กเกจ 2 ประเภทแรกอาจมี - นำหน้าด้วย เพื่อระบุว่ามีการปฏิเสธ

กลุ่มแพ็กเกจมีแพ็กเกจใดๆ ที่ตรงกับข้อกำหนดเฉพาะอย่างน้อย 1 รายการและไม่มีข้อกำหนดเชิงลบ เช่น ค่า [//foo/..., -//foo/tests/...] รวมแพ็กเกจย่อยทั้งหมดของ //foo ที่ไม่ใช่แพ็กเกจย่อยของ //foo/tests (//foo เองรวมอยู่ในส่วนนี้ ในขณะที่ //foo/tests เองไม่ได้อยู่)

นอกเหนือจากระดับการเข้าถึงแบบสาธารณะแล้ว ไม่มีวิธีระบุแพ็กเกจภายนอกที่เก็บปัจจุบันโดยตรง

หากไม่มีแอตทริบิวต์นี้ จะเหมือนกับการตั้งค่าเป็นรายการที่ว่างเปล่า ซึ่งเหมือนกับการตั้งค่าเป็นรายการที่มี private เท่านั้น

หมายเหตุ: ก่อน Bazel 6.0 ข้อกำหนด //... มีลักษณะการทำงานเดิมเหมือนกับ public ลักษณะการทำงานนี้จะได้รับการแก้ไขเมื่อเปิดใช้ --incompatible_fix_package_group_reporoot_syntax ซึ่งเป็นค่าเริ่มต้นหลังจาก Bazel 6.0

หมายเหตุ: ก่อนหน้า Bazel 6.0 เมื่อมีการต่อเนื่องของแอตทริบิวต์นี้เป็นส่วนหนึ่งของ bazel query --output=proto (หรือ --output=xml) ระบบจะไม่ใส่เครื่องหมายทับนำหน้า ตัวอย่างเช่น //pkg/foo/... จะแสดงผลเป็น \"pkg/foo/...\" ลักษณะการทำงานนี้จะแก้ไขเมื่อเปิดใช้ --incompatible_package_group_includes_double_slash ซึ่งเป็นค่าเริ่มต้นหลังจาก Bazel 6.0

includes

List of labels; optional

กลุ่มแพ็กเกจอื่นๆ ที่รวมอยู่ในกลุ่มนี้

ป้ายกำกับในแอตทริบิวต์นี้ต้องอ้างอิงถึงกลุ่มแพ็กเกจอื่นๆ ระบบจะย้ายแพ็กเกจในกลุ่มแพ็กเกจที่อ้างอิงให้เป็นส่วนหนึ่งของกลุ่มแพ็กเกจนี้ วิธีนี้เป็นการเปลี่ยนผ่าน หากกลุ่มแพ็กเกจ a มีกลุ่มแพ็กเกจ b และ b มีกลุ่มแพ็กเกจ c อยู่ ทุกแพ็กเกจใน c จะเป็นสมาชิกของ a ด้วย

เมื่อใช้ร่วมกับข้อกำหนดของแพ็กเกจที่ปฏิเสธแล้ว โปรดทราบว่าระบบจะคำนวณชุดแพ็กเกจของแต่ละกลุ่มแยกกันก่อน และผลลัพธ์ที่ได้จะรวมกัน ซึ่งหมายความว่าข้อกำหนดที่ลบล้างในกลุ่มหนึ่งจะไม่มีผลต่อข้อมูลจำเพาะของอีกกลุ่มหนึ่ง

ตัวอย่าง

การประกาศ 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

glob(include, exclude=[], exclude_directories=1, allow_empty=True)

Glob เป็นฟังก์ชันช่วยที่จะค้นหาไฟล์ทั้งหมดที่ตรงกับรูปแบบเส้นทางที่กำหนด และแสดงผลรายการเส้นทางใหม่ที่เปลี่ยนแปลงและจัดเรียงได้ Glob จะค้นหาเฉพาะไฟล์ในแพ็กเกจของตัวเองและดูเฉพาะไฟล์ต้นฉบับ (ไม่ใช่ไฟล์ที่สร้างขึ้นหรือเป้าหมายอื่นๆ)

ป้ายกำกับของไฟล์ซอร์สจะรวมอยู่ในผลลัพธ์หากเส้นทางแบบสัมพัทธ์ของแพ็กเกจของไฟล์ตรงกับรูปแบบ include ใดๆ และไม่มีรูปแบบ exclude เลย

รายการ include และ exclude มีรูปแบบเส้นทางที่สัมพันธ์กับแพ็กเกจปัจจุบัน ทุกรูปแบบอาจประกอบด้วยกลุ่มเส้นทางอย่างน้อย 1 กลุ่ม และเช่นเคยสำหรับเส้นทาง Unix กลุ่มเหล่านี้จะคั่นด้วย / กลุ่มอาจมีไวลด์การ์ด * ซึ่งจะตรงกับสตริงย่อยในกลุ่มเส้นทาง (รวมถึงสตริงย่อยที่ว่างเปล่า) โดยไม่รวมตัวคั่นไดเรกทอรี / ไวลด์การ์ดนี้ใช้ได้หลายครั้ง ภายในกลุ่มเส้นทาง 1 กลุ่ม นอกจากนี้ ไวลด์การ์ด ** จะจับคู่กับกลุ่มเส้นทางที่สมบูรณ์ตั้งแต่ 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 รายการบนเส้นทางผลลัพธ์ เช่น xxx/bar/yyy/zzz/a.txt หรือ bar/a.txt (อย่าลืมว่า ** ตรงกับกลุ่ม 0 กลุ่มด้วย) หรือ bar/zzz/a.txtbar
  • ** ตรงกับทุกไฟล์ในทุกไดเรกทอรีย่อยของแพ็กเกจนี้
  • foo**/a.txt เป็นรูปแบบที่ไม่ถูกต้อง เนื่องจาก ** ต้อง ยืนเดี่ยวเป็นกลุ่ม

หากเปิดใช้อาร์กิวเมนต์ exclude_directories (ตั้งค่าเป็น 1) ไฟล์ของไดเรกทอรีประเภทจะไม่ปรากฏในผลลัพธ์ (ค่าเริ่มต้นคือ 1)

หากตั้งค่าอาร์กิวเมนต์ allow_empty เป็น False ฟังก์ชัน glob จะเกิดข้อผิดพลาดหากผลลัพธ์เป็นรายการที่ว่างเปล่า

มีข้อจำกัดและคำเตือนที่สำคัญหลายประการดังนี้

  1. เนื่องจาก glob() ทำงานระหว่างการประเมินไฟล์ BUILD ดังนั้น glob() จะจับคู่ไฟล์ในซอร์สและไม่สร้างไฟล์ หากคุณกำลังสร้างเป้าหมายที่ต้องใช้ทั้งไฟล์ต้นฉบับและไฟล์ที่สร้างขึ้น คุณต้องผนวกรายการไฟล์ที่สร้างขึ้นอย่างชัดแจ้งไปยัง glob ดูตัวอย่างด้านล่างที่มี :mylib และ :gen_java_srcs

  2. หากกฎมีชื่อเหมือนกับไฟล์ต้นฉบับที่ตรงกัน กฎนั้นจะ "เงา" กับไฟล์

    โปรดทราบว่า glob() จะแสดงผลรายการเส้นทาง ดังนั้นการใช้ glob() ในแอตทริบิวต์ของกฎอื่น (เช่น srcs = glob(["*.cc"])) จะมีผลเช่นเดียวกับการแสดงเส้นทางที่ตรงกันอย่างชัดแจ้ง เช่น หาก glob() ให้ผลที่ได้ ["Foo.java", "bar/Baz.java"] แต่ในแพ็กเกจมีกฎชื่อ "Foo.java" (ซึ่งได้รับอนุญาต แต่ Bazel จะเตือน) ผู้บริโภคของ glob() จะใช้กฎ "Foo.java" (เอาต์พุต) แทนไฟล์ "Foo.java" ดูรายละเอียดเพิ่มเติมได้ที่ปัญหาของ GitHub #10395

  3. Globs อาจตรงกับไฟล์ในไดเรกทอรีย่อย และชื่อไดเรกทอรีย่อยอาจใช้ไวลด์การ์ดได้ อย่างไรก็ตาม...
  4. ป้ายกำกับไม่ได้รับอนุญาตให้ข้ามขอบเขตของแพ็กเกจและ glob ไม่ตรงกับไฟล์ในแพ็กเกจย่อย

    ตัวอย่างเช่น นิพจน์ glob **/*.cc ในแพ็กเกจ x จะไม่รวม x/y/z.cc หากมี x/y เป็นแพ็กเกจ (เป็น x/y/BUILD หรือที่อื่นบนเส้นทางแพ็กเกจ) ซึ่งหมายความว่าผลลัพธ์ของนิพจน์ glob นั้นจริงๆ แล้วขึ้นอยู่กับการมีอยู่ของไฟล์ BUILD กล่าวคือ นิพจน์ glob เดียวกันจะรวม x/y/z.cc หากไม่มีแพ็กเกจชื่อ x/y หรือมีการทำเครื่องหมายว่าลบแล้วโดยใช้แฟล็ก --deleted_packages

  5. ข้อจำกัดข้างต้นจะมีผลกับนิพจน์ glob ทั้งหมด ไม่ว่าจะใช้ไวลด์การ์ดใด
  6. ไฟล์ที่ซ่อนไว้ซึ่งมีชื่อไฟล์ขึ้นต้นด้วย . จับคู่อย่างสมบูรณ์โดยทั้งไวลด์การ์ด ** และไวลด์การ์ด * หากต้องการจับคู่ไฟล์ที่ซ่อนอยู่กับรูปแบบผสม รูปแบบของคุณจะต้องขึ้นต้นด้วย . ตัวอย่างเช่น * และ .*.txt จะจับคู่กับ .foo.txt แต่ *.txt จะไม่จับคู่ ไดเรกทอรีที่ซ่อนจะมีการจับคู่ในลักษณะเดียวกัน ไดเรกทอรีที่ซ่อนไว้อาจรวมถึงไฟล์ที่ไม่จำเป็นเป็นอินพุต และอาจเพิ่มจำนวนไฟล์ที่มี Globbbing และการใช้หน่วยความจำโดยไม่จำเป็น หากต้องการยกเว้นไดเรกทอรีที่ซ่อนอยู่ ให้เพิ่มไดเรกทอรีเหล่านั้นลงในอาร์กิวเมนต์รายการ "exclude"
  7. ไวลด์การ์ด "**" มีตัวพิมพ์ที่มุม 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 ยกเว้น Experiment.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 ด้านล่าง
  • หากเงื่อนไขหลายข้อตรงกันและ 1 รายการไม่ใช่ความเชี่ยวชาญพิเศษของเงื่อนไขอื่นๆ ทั้งหมด 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 แทนการเรียกใช้ฟังก์ชันนี้โดยตรง