Bazel สร้างซอฟต์แวร์จากซอร์สโค้ดที่จัดระเบียบในโครงสร้างไดเรกทอรีที่เรียกว่า
ที่เก็บ ชุดที่เก็บที่กำหนดจะประกอบกันเป็นพื้นที่ทำงาน ไฟล์ต้นฉบับในที่เก็บจะจัดระเบียบในลำดับชั้นของแพ็กเกจที่ซ้อนกัน โดยแต่ละแพ็กเกจจะเป็นไดเรกทอรีที่มีชุดไฟล์ต้นฉบับที่เกี่ยวข้องและไฟล์ BUILD
1 ไฟล์ ไฟล์ BUILD
จะระบุเอาต์พุตซอฟต์แวร์ที่สร้างจากแหล่งที่มาได้
ที่เก็บ
ไฟล์ต้นฉบับที่ใช้ในบิลด์ Bazel จะได้รับการจัดระเบียบในที่เก็บ (มักย่อเป็นที่เก็บ) Repo คือแผนผังไดเรกทอรีที่มีไฟล์เครื่องหมายขอบเขตที่รูท โดยไฟล์เครื่องหมายขอบเขตดังกล่าวอาจเป็น MODULE.bazel
, REPO.bazel
หรือในบริบทเดิม WORKSPACE
หรือ WORKSPACE.bazel
ที่เก็บที่ใช้เรียกใช้คำสั่ง Bazel ปัจจุบันเรียกว่าที่เก็บหลัก ส่วนที่เหลือ (ภายนอก) จะกำหนดโดยกฎของที่เก็บ ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมของ การอ้างอิงภายนอก
Workspace
พื้นที่ทำงานคือสภาพแวดล้อมที่คำสั่ง Bazel ทั้งหมดใช้ร่วมกันซึ่งทำงานจากที่เก็บหลักเดียวกัน ซึ่งครอบคลุมทั้งที่เก็บหลักและชุดที่เก็บภายนอกทั้งหมดที่กำหนดไว้
โปรดทราบว่าที่ผ่านมาแนวคิด "ที่เก็บข้อมูล" และ "พื้นที่ทำงาน" มักใช้รวมๆ กัน คำว่า "พื้นที่ทำงาน" มักใช้เพื่ออ้างอิงถึงที่เก็บข้อมูลหลัก และบางครั้งยังใช้เป็นคำพ้องความหมายของ "ที่เก็บข้อมูล" ด้วย
แพ็กเกจ
หน่วยหลักของการจัดระเบียบโค้ดในที่เก็บคือแพ็กเกจ แพ็กเกจคือคอลเล็กชันของไฟล์ที่เกี่ยวข้องและข้อกำหนดเกี่ยวกับวิธีใช้ไฟล์เหล่านั้น เพื่อสร้างอาร์ติแฟกต์เอาต์พุต
แพ็กเกจจะกำหนดเป็นไดเรกทอรีที่มีไฟล์ BUILD
ที่ชื่อ BUILD
หรือ BUILD.bazel
แพ็กเกจประกอบด้วยไฟล์ทั้งหมดในไดเรกทอรีของแพ็กเกจ รวมถึงไดเรกทอรีย่อยทั้งหมดที่อยู่ใต้ไดเรกทอรีนั้น ยกเว้นไดเรกทอรีย่อยที่มีไฟล์ BUILD
จากคำจำกัดความนี้ ไม่มี
ไฟล์หรือไดเรกทอรีใดที่เป็นส่วนหนึ่งของแพ็กเกจ 2 แพ็กเกจที่แตกต่างกันได้
ตัวอย่างเช่น ในโครงสร้างไดเรกทอรีต่อไปนี้มีแพ็กเกจ 2 รายการ ได้แก่ my/app
และแพ็กเกจย่อย my/app/tests
โปรดทราบว่า my/app/data
ไม่ใช่แพ็กเกจ แต่เป็น
ไดเรกทอรีที่อยู่ในแพ็กเกจ my/app
src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc
เป้าหมาย
แพ็กเกจคือคอนเทนเนอร์ของเป้าหมาย ซึ่งกำหนดไว้ในไฟล์
BUILD
ของแพ็กเกจ เป้าหมายส่วนใหญ่เป็น ไฟล์และกฎ
ไฟล์จะแบ่งออกเป็น 2 ประเภท ไฟล์ต้นฉบับมักจะเขียนขึ้นจาก ความพยายามของผู้คนและเช็คอินไปยังที่เก็บ ไฟล์ที่สร้างขึ้น บางครั้งเรียกว่าไฟล์ที่ได้มาหรือไฟล์เอาต์พุต จะไม่ได้เช็คอิน แต่จะ สร้างขึ้นจากไฟล์ต้นฉบับ
เป้าหมายประเภทที่ 2 ประกาศด้วยกฎ แต่ละอินสแตนซ์ของกฎ จะระบุความสัมพันธ์ระหว่างชุดไฟล์อินพุตกับชุดไฟล์เอาต์พุต อินพุตของกฎอาจเป็นไฟล์ต้นฉบับ แต่ก็อาจเป็นเอาต์พุตของกฎอื่นๆ ด้วย
ไม่ว่าอินพุตของกฎจะเป็นไฟล์ต้นฉบับหรือไฟล์ที่สร้างขึ้นก็ไม่สำคัญในกรณีส่วนใหญ่ สิ่งที่สำคัญคือเนื้อหาของไฟล์นั้นเท่านั้น ข้อเท็จจริงนี้ ช่วยให้แทนที่ไฟล์ต้นฉบับที่ซับซ้อนด้วยไฟล์ที่สร้างขึ้นจาก กฎได้ง่าย เช่น ในกรณีที่การดูแลไฟล์ที่มีโครงสร้างสูงด้วยตนเองกลายเป็นภาระที่น่าเบื่อเกินไป และมีผู้เขียนโปรแกรมเพื่อดึงข้อมูลดังกล่าว ผู้ใช้ไฟล์ดังกล่าวไม่จำเป็นต้องทำการเปลี่ยนแปลงใดๆ ในทางกลับกัน คุณอาจแทนที่ไฟล์ที่สร้างขึ้น ด้วยไฟล์ต้นฉบับที่มีการเปลี่ยนแปลงในเครื่องเท่านั้นได้อย่างง่ายดาย
อินพุตของกฎอาจรวมถึงกฎอื่นๆ ด้วย ความหมายที่แน่นอนของความสัมพันธ์ดังกล่าวมักจะค่อนข้างซับซ้อนและขึ้นอยู่กับภาษาหรือกฎ แต่โดยสัญชาตญาณแล้วก็เป็นเรื่องง่ายๆ นั่นคือ กฎไลบรารี C++ กฎ A อาจมีกฎไลบรารี C++ อีกกฎหนึ่งคือกฎ B สำหรับอินพุต ผลของการขึ้นต่อกันนี้คือไฟล์ส่วนหัวของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการคอมไพล์ สัญลักษณ์ของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการลิงก์ และข้อมูลรันไทม์ของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการดำเนินการ
กฎทั้งหมดมีสิ่งที่ไม่เปลี่ยนแปลงคือไฟล์ที่สร้างโดยกฎจะเป็นของแพ็กเกจเดียวกันกับกฎเสมอ และไม่สามารถสร้างไฟล์ลงในแพ็กเกจอื่นได้ อย่างไรก็ตาม การป้อนข้อมูลของกฎมาจากแพ็กเกจอื่นก็เป็นเรื่องปกติ
กลุ่มแพ็กเกจคือชุดแพ็กเกจที่มีวัตถุประสงค์เพื่อจำกัดการเข้าถึง
กฎบางอย่าง กลุ่มแพ็กเกจกำหนดโดยฟังก์ชัน package_group
โดยมีคุณสมบัติ 3 อย่าง ได้แก่ รายการแพ็กเกจที่มี ชื่อ และกลุ่มแพ็กเกจอื่นๆ ที่รวมอยู่ วิธีเดียวที่อนุญาตให้ใช้เพื่ออ้างอิงถึงไฟล์เหล่านี้คือจากแอตทริบิวต์ visibility
ของกฎ หรือจากแอตทริบิวต์ default_visibility
ของฟังก์ชัน package
โดยไฟล์เหล่านี้จะไม่สร้างหรือใช้ไฟล์ ดูข้อมูลเพิ่มเติมได้ในpackage_group
เอกสารประกอบ