Bazel สร้างซอฟต์แวร์จากซอร์สโค้ดที่จัดระเบียบในโครงสร้างไดเรกทอรีที่เรียกว่า
พื้นที่ทำงาน ไฟล์ต้นฉบับในพื้นที่ทำงานจะจัดระเบียบในลำดับชั้นของแพ็กเกจที่ซ้อนกัน โดยแต่ละแพ็กเกจจะเป็นไดเรกทอรีที่มีชุดไฟล์ต้นฉบับที่เกี่ยวข้องและไฟล์ BUILD
1 ไฟล์ ไฟล์ BUILD
จะระบุว่าสามารถสร้างเอาต์พุตซอฟต์แวร์ใดจากแหล่งที่มาได้
Workspace
พื้นที่ทำงานคือแผนผังไดเรกทอรีในระบบไฟล์ที่มีไฟล์ต้นฉบับสำหรับซอฟต์แวร์ที่คุณต้องการสร้าง แต่ละเวิร์กสเปซจะมีไฟล์ข้อความชื่อ
WORKSPACE
ซึ่งอาจว่างเปล่าหรืออาจมีการอ้างอิงถึง
การอ้างอิงภายนอกที่จำเป็นต่อการสร้างเอาต์พุต
ไดเรกทอรีที่มีไฟล์ชื่อ WORKSPACE
จะถือเป็นรูทของ
พื้นที่ทำงาน ดังนั้น Bazel จะไม่สนใจแผนผังไดเรกทอรีใดๆ ในพื้นที่ทำงานที่รูทอยู่ในไดเรกทอรีย่อยซึ่งมีไฟล์ WORKSPACE
เนื่องจากไดเรกทอรีเหล่านั้นเป็นพื้นที่ทำงานอื่น
นอกจากนี้ Bazel ยังรองรับไฟล์ WORKSPACE.bazel
เป็นนามแฝงของไฟล์ WORKSPACE
ด้วย
หากมีทั้ง 2 ไฟล์ ระบบจะใช้ WORKSPACE.bazel
ที่เก็บ
โค้ดจะได้รับการจัดระเบียบในที่เก็บ ไดเรกทอรีที่มีไฟล์ WORKSPACE
คือรูทของที่เก็บหลัก หรือที่เรียกว่า @
ส่วนที่เก็บข้อมูลอื่นๆ (ภายนอก) จะกำหนดไว้ในไฟล์ WORKSPACE
โดยใช้กฎของพื้นที่ทำงาน
กฎพื้นที่ทำงานที่มาพร้อมกับ Bazel มีเอกสารประกอบอยู่ในส่วนกฎพื้นที่ทำงานในสารานุกรมการสร้างและเอกสารประกอบเกี่ยวกับกฎที่เก็บ Starlark แบบฝัง
เนื่องจากที่เก็บภายนอกเป็นที่เก็บด้วยตัวเอง จึงมักจะมีไฟล์ WORKSPACE
ด้วย อย่างไรก็ตาม Bazel จะไม่สนใจWORKSPACE
ไฟล์เพิ่มเติมเหล่านี้ โดยเฉพาะอย่างยิ่ง ระบบจะไม่เพิ่มที่เก็บที่ขึ้นอยู่กับแบบทรานซิทีฟโดยอัตโนมัติ
แพ็กเกจ
หน่วยหลักของการจัดระเบียบโค้ดในที่เก็บคือแพ็กเกจ แพ็กเกจคือชุดของไฟล์ที่เกี่ยวข้องและข้อกำหนดเกี่ยวกับวิธีใช้ไฟล์เหล่านั้นเพื่อสร้างอาร์ติแฟกต์เอาต์พุต
แพ็กเกจจะกำหนดเป็นไดเรกทอรีที่มีไฟล์ชื่อ 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
เอกสารประกอบ