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