ฟังก์ชัน

รายงานปัญหา ดูแหล่งที่มา รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

เนื้อหา

พัสดุ

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_package_metadata

default_visibility

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ระดับการเข้าถึงเริ่มต้นของเป้าหมายกฎระดับบนสุดและมาโครเชิงสัญลักษณ์ในแพ็กเกจนี้ กล่าวคือ เป้าหมายและมาโครเชิงสัญลักษณ์ที่ไม่ได้ประกาศภายในมาโครเชิงสัญลักษณ์ ระบบจะละเว้นแอตทริบิวต์นี้หากเป้าหมายหรือมาโครระบุค่า visibility

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

default_deprecation

สตริง ค่าเริ่มต้นคือ ""

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

default_package_metadata

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

ตั้งค่ารายการเป้าหมายข้อมูลเมตาเริ่มต้นที่ใช้กับเป้าหมายอื่นๆ ทั้งหมดในแพ็กเกจ โดยปกติแล้วเป้าหมายเหล่านี้เกี่ยวข้องกับแพ็กเกจ OSS และการประกาศใบอนุญาต ดูตัวอย่างได้ที่ rules_license

default_testonly

บูลีน ค่าเริ่มต้นคือ False ยกเว้นตามที่ระบุไว้

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

ในแพ็กเกจที่อยู่ภายใต้ javatests ค่าเริ่มต้นคือ True

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 รายการขึ้นไป

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

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

รายการป้ายกํากับ ค่าเริ่มต้นคือ []

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

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

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

ตัวอย่าง

การประกาศ 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/ จะเป็นแพ็กเกจย่อย)
  • foo/*.txt จะจับคู่กับไฟล์ทุกไฟล์ในไดเรกทอรี foo/ หากไฟล์ลงท้ายด้วย .txt (เว้นแต่ foo/ จะเป็นแพ็กเกจย่อย)
  • foo/a*.htm* จะจับคู่กับไฟล์ทุกไฟล์ในไดเรกทอรี foo/ ที่ขึ้นต้นด้วย a ตามด้วยสตริงที่กำหนดเอง (อาจเป็นสตริงว่าง) ตามด้วย .htm และลงท้ายด้วยสตริงที่กำหนดเองอีกรายการ (เว้นแต่ foo/ จะเป็นแพ็กเกจย่อย) เช่น foo/axx.htm และ foo/a.html หรือ foo/axxx.html
  • foo/* จะจับคู่กับไฟล์ทุกไฟล์ในไดเรกทอรี foo/ (เว้นแต่ foo/ จะเป็นแพ็กเกจย่อย) แต่จะไม่ได้จับคู่กับไดเรกทอรี foo เอง แม้ว่าจะตั้งค่า exclude_directories เป็น 0 ก็ตาม
  • foo/** จะจับคู่กับทุกไฟล์ในไดเรกทอรีย่อยที่ไม่ใช่แพ็กเกจย่อยทุกไดเรกทอรีภายใต้ไดเรกทอรีย่อยระดับแรกของแพ็กเกจ foo/ หากตั้งค่า exclude_directories เป็น 0 ไดเรกทอรี foo จะจับคู่กับรูปแบบด้วยเช่นกัน ในกรณีนี้ ระบบจะถือว่า ** จับคู่กับส่วนของเส้นทางที่เป็น 0
  • **/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 เป็นรูปแบบที่ไม่ถูกต้อง เนื่องจาก ** ต้องอยู่เดี่ยวๆ เป็นกลุ่ม
  • foo/ เป็นรูปแบบที่ไม่ถูกต้อง เนื่องจากกลุ่มที่ 2 ที่กําหนดไว้หลังจาก / เป็นสตริงว่าง

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

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

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

  1. เนื่องจาก glob() ทำงานระหว่างการประเมินไฟล์ BUILD 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" ดูรายละเอียดเพิ่มเติมได้ในปัญหา #10395 ของ GitHub

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

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

  5. ข้อจำกัดข้างต้นมีผลกับนิพจน์ทั่วไปทั้งหมด ไม่ว่าจะใช้ไวลด์การ์ดใดก็ตาม
  6. ไฟล์ที่ซ่อนซึ่งมีชื่อไฟล์ขึ้นต้นด้วย . จะตรงกันทั้งหมดกับทั้งไวลด์การ์ด ** และ * หากต้องการจับคู่ไฟล์ที่ซ่อนอยู่กับรูปแบบแบบผสม รูปแบบต้องขึ้นต้นด้วย . เช่น * และ .*.txt จะจับคู่กับ .foo.txt แต่ *.txt จะไม่จับคู่ ระบบจะจับคู่ไดเรกทอรีที่ซ่อนอยู่ด้วยในลักษณะเดียวกัน ไดเรกทอรีที่ซ่อนอยู่อาจรวมไฟล์ที่ไม่จําเป็นต้องใช้เป็นอินพุต และอาจเพิ่มจํานวนไฟล์ที่รวมแบบ Glob โดยไม่จําเป็นและการใช้หน่วยความจํา หากต้องการยกเว้นไดเรกทอรีที่ซ่อนอยู่ ให้เพิ่มไดเรกทอรีนั้นลงในอาร์กิวเมนต์รายการ "exclude"
  7. ไวลด์การ์ด "**" มีกรณีพิเศษ 1 กรณีคือ รูปแบบ "**" ไม่ตรงกับเส้นทางไดเรกทอรีของแพ็กเกจ กล่าวคือ glob(["**"], exclude_directories = False) จะจับคู่กับไฟล์และไดเรกทอรีทั้งหมดในไดเรกทอรีของแพ็กเกจปัจจุบันแบบทรานซิทีฟอย่างเคร่งครัด (แต่จะไม่เข้าไปในไดเรกทอรีของแพ็กเกจย่อย โปรดดูหมายเหตุก่อนหน้าเกี่ยวกับเรื่องนี้)

โดยทั่วไป คุณควรพยายามระบุนามสกุลที่เหมาะสม (เช่น *.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/bar/but/bad/BUILD
    # foo/sub/BUILD
    # foo/sub/deeper/BUILD
    #
    # In foo/BUILD a call to
    subs1 = subpackages(include = ["**"])
    
    # results in subs1 == ["sub", "bar/baz", "bar/but/bad"]
    #
    # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of
    # 'foo'
    
    subs2 = subpackages(include = ["bar/*"])
    # results in subs2 = ["bar/baz"]
    #
    # Since 'bar' is not a subpackage itself, this looks for any subpackages under
    # all first level subdirectories of 'bar'.
    
    subs3 = subpackages(include = ["bar/**"])
    # results in subs3 = ["bar/baz", "bar/but/bad"]
    #
    # Since bar is not a subpackage itself, this looks for any subpackages which are
    # (1) under all subdirectories of 'bar' which can be at any level, (2) not a
    # subpackage of another subpackages.
    
    subs4 = subpackages(include = ["sub"])
    subs5 = subpackages(include = ["sub/*"])
    subs6 = subpackages(include = ["sub/**"])
    # results in subs4 and subs6 being ["sub"]
    # results in subs5 = [].
    #
    # In subs4, expression "sub" checks whether 'foo/sub' is a package (i.e. is a
    # subpackage of 'foo').
    # In subs5, "sub/*" looks for subpackages under directory 'foo/sub'. Since
    # 'foo/sub' is already a subpackage itself, the subdirectories will not be
    # traversed anymore.
    # In subs6, 'foo/sub' is a subpackage itself and matches pattern "sub/**", so it
    # is returned. But the subdirectories of 'foo/sub' will not be traversed
    # anymore.
    

    โดยทั่วไปแล้ว เราขอแนะนำให้ผู้ใช้ใช้โมดูล "subpackages" ของ skylib แทนการเรียกใช้ฟังก์ชันนี้โดยตรง