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