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