บาเซลสร้างซอฟต์แวร์จากซอร์สโค้ดที่จัดอยู่ในแผนผังไดเรกทอรีที่เรียกว่าพื้นที่ทำงาน ไฟล์ซอร์สในพื้นที่ทำงานจะได้รับการจัดระเบียบเป็นลำดับชั้นของแพ็กเกจที่ฝังอยู่ โดยแต่ละแพ็กเกจคือไดเรกทอรีที่มีชุดไฟล์ต้นทางที่เกี่ยวข้อง 1 ชุดและไฟล์ BUILD
1 ไฟล์ ไฟล์ BUILD
จะระบุเอาต์พุตของซอฟต์แวร์ที่สามารถสร้างได้จากต้นทาง
Workspace
พื้นที่ทำงานคือแผนผังไดเรกทอรีในระบบไฟล์ที่มีไฟล์ต้นฉบับของซอฟต์แวร์ที่ต้องการสร้าง พื้นที่ทำงานแต่ละแห่งมีไฟล์ข้อความชื่อ WORKSPACE
ซึ่งอาจว่างเปล่าหรืออาจมีการอ้างอิงไปยังทรัพยากร Dependency ภายนอกที่จำเป็นต่อการสร้างเอาต์พุต
ไดเรกทอรีที่มีไฟล์ชื่อ WORKSPACE
จะถือว่าเป็นรูทของพื้นที่ทำงาน ดังนั้น Bazel จะไม่สนใจต้นไม้ไดเรกทอรีในพื้นที่ทำงานซึ่งรูทที่ไดเรกทอรีย่อยที่มีไฟล์ WORKSPACE
เนื่องจากต้นไม้เหล่านั้นเป็นพื้นที่ทำงานอีกแห่งหนึ่ง
Bazel ยังรองรับไฟล์ WORKSPACE.bazel
เป็นชื่อแทนของไฟล์ WORKSPACE
ด้วย
หากมีทั้ง 2 ไฟล์ ระบบจะใช้ WORKSPACE.bazel
ที่เก็บ
โค้ดจะจัดอยู่ในที่เก็บ ไดเรกทอรีที่มีไฟล์ WORKSPACE
คือรูทของที่เก็บหลักหรือที่เรียกว่า @
ส่วนที่เก็บอื่นๆ (ภายนอก)
จะกำหนดไว้ในไฟล์ WORKSPACE
โดยใช้กฎพื้นที่ทำงาน
กฎของพื้นที่ทำงานที่รวมเข้ากับ Bazel จะได้รับการบันทึกไว้ในส่วนกฎพื้นที่ทำงานใน Build Encyclopedia และเอกสารประกอบเกี่ยวกับกฎที่เก็บของ 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
เป้าหมาย
แพ็กเกจคือคอนเทนเนอร์ของ targets ซึ่งกำหนดไว้ในไฟล์ BUILD
ของแพ็กเกจ เป้าหมายส่วนใหญ่เป็น 1 ใน 2 ประเภทหลัก ได้แก่ ไฟล์และกฎ
ไฟล์จะแบ่งออกเป็น 2 ประเภทเพิ่มเติม ไฟล์ต้นฉบับมักจะเขียนขึ้นด้วยความพยายามของผู้คน และเช็คอินในที่เก็บ ไฟล์ที่สร้าง ซึ่งบางครั้งเรียกว่าไฟล์ที่ได้รับมาหรือไฟล์เอาต์พุตจะไม่ได้รับการเช็คอิน แต่สร้างขึ้นจากไฟล์ต้นฉบับ
เป้าหมายประเภทที่ 2 จะได้รับการประกาศด้วยกฎ อินสแตนซ์ของกฎแต่ละข้อจะระบุความสัมพันธ์ระหว่างชุดอินพุตและชุดไฟล์เอาต์พุต อินพุตของกฎอาจเป็นไฟล์ต้นฉบับ แต่ก็อาจเป็นเอาต์พุตของกฎอื่นๆ ด้วย
ไม่ว่าอินพุตไปยังกฎจะเป็นไฟล์ต้นฉบับหรือไฟล์ที่สร้างขึ้นนั้นจะเป็นไฟล์ที่ไม่มีรูปร่าง (Immaterial) เป็นส่วนใหญ่ แต่สิ่งที่สำคัญคือเนื้อหาของไฟล์นั้นเท่านั้น ข้อเท็จจริงนี้ทำให้การแทนที่ไฟล์ต้นฉบับที่ซับซ้อนด้วยไฟล์ที่สร้างขึ้นตามกฎเป็นเรื่องง่าย เช่น กรณีที่ปัญหาในการดูแลรักษาไฟล์ที่มีโครงสร้างมากด้วยตนเองเป็นเรื่องที่น่าเหนื่อยเกินไป และมีคนเขียนโปรแกรมเพื่อรับไฟล์ดังกล่าว ผู้ใช้ไม่จำเป็นต้องทำการเปลี่ยนแปลงไฟล์ ในทางกลับกัน ไฟล์ที่สร้างขึ้นสามารถแทนที่ได้ง่ายๆ ด้วยไฟล์แหล่งที่มาที่มีการเปลี่ยนแปลงเฉพาะเครื่อง
อินพุตของกฎอาจรวมกฎอื่นๆ ด้วย ความหมายที่ถูกต้องแม่นยำของความสัมพันธ์ดังกล่าวมักจะค่อนข้างซับซ้อนและขึ้นอยู่กับภาษาหรือกฎ แต่พูดง่ายๆ ก็คือกฎไลบรารี C++ A อาจมีกฎไลบรารี C++ B อีกกฎสำหรับอินพุต ผลของทรัพยากร Dependency นี้คือไฟล์ส่วนหัวของ B จะใช้ได้กับ A ในระหว่างการคอมไพล์ สัญลักษณ์ของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการลิงก์ และข้อมูลรันไทม์ของ B จะพร้อมใช้งานสำหรับ A ระหว่างการดำเนินการ
กฎทั้งหมดมีความไม่แน่นอนคือ ไฟล์ที่กฎสร้างขึ้นจะอยู่ในแพ็กเกจเดียวกับกฎนั้นเสมอ และจะสร้างไฟล์ลงในแพ็กเกจอื่นไม่ได้ แต่ก็เป็นเรื่องปกติที่อินพุตของกฎ จะมาจากแพ็กเกจอื่น
กลุ่มแพ็กเกจคือชุดของแพ็กเกจที่มีวัตถุประสงค์เพื่อจำกัดการช่วยเหลือพิเศษของกฎบางข้อ ฟังก์ชัน package_group
จะเป็นผู้กำหนดกลุ่มแพ็กเกจ
โดยมี 3 พร็อพเพอร์ตี้ ได้แก่ รายการแพ็กเกจที่มี ชื่อแพ็กเกจ และกลุ่มแพ็กเกจอื่นๆ ที่มี โดยวิธีที่อนุญาตมีเพียงวิธีเดียวที่จะอ้างอิงแอตทริบิวต์เหล่านี้คือจากแอตทริบิวต์ visibility
ของกฎหรือจากแอตทริบิวต์ default_visibility
ของฟังก์ชัน package
โดยจะไม่สร้างหรือใช้ไฟล์
ดูข้อมูลเพิ่มเติมได้ในเอกสารประกอบของ package_group