พื้นที่ทำงาน แพ็กเกจ และเป้าหมาย

Bazel สร้างซอฟต์แวร์จากซอร์สโค้ดที่จัดระเบียบในโครงสร้างไดเรกทอรีที่เรียกว่า Workspace ไฟล์ต้นฉบับใน Workspace จะจัดระเบียบในลำดับชั้นแบบซ้อนของแพ็กเกจ โดยแต่ละแพ็กเกจจะเป็นไดเรกทอรีที่มีชุดไฟล์ต้นฉบับที่เกี่ยวข้องและไฟล์ BUILD 1 ไฟล์ ไฟล์ BUILD จะระบุเอาต์พุตของซอฟต์แวร์ที่สร้างได้จากต้นฉบับ

Workspace

Workspace คือโครงสร้างไดเรกทอรีในระบบไฟล์ที่มีไฟล์ต้นฉบับของซอฟต์แวร์ที่คุณต้องการสร้าง Workspace แต่ละรายการจะมีไฟล์ข้อความชื่อ WORKSPACE ซึ่งอาจว่างเปล่าหรือมีข้อมูลอ้างอิงถึง ทรัพยากร Dependency ภายนอก ที่จำเป็นต่อการสร้างเอาต์พุต

ระบบจะถือว่าไดเรกทอรีที่มีไฟล์ชื่อ WORKSPACE เป็นรูทของ Workspace ดังนั้น Bazel จะไม่สนใจโครงสร้างไดเรกทอรีใน Workspace ที่รูทอยู่ในไดเรกทอรีย่อยที่มีไฟล์ WORKSPACE เนื่องจากไดเรกทอรีเหล่านั้นจะสร้าง Workspace อื่น

นอกจากนี้ Bazel ยังรองรับไฟล์ WORKSPACE.bazel เป็นนามแฝงของไฟล์ WORKSPACE ด้วย หากมีทั้ง 2 ไฟล์ ระบบจะใช้ WORKSPACE.bazel

ที่เก็บ

โค้ดจะจัดระเบียบใน ที่เก็บ ไดเรกทอรีที่มีไฟล์ WORKSPACE คือรูทของที่เก็บหลัก ซึ่งเรียกอีกอย่างว่า @ ที่เก็บอื่นๆ (ภายนอก) จะกำหนดไว้ในไฟล์ WORKSPACE โดยใช้กฎของ Workspace หรือสร้างจากโมดูลและส่วนขยายในระบบ Bzlmod ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมของทรัพยากร Dependency ภายนอก

กฎของ Workspace ที่มาพร้อมกับ Bazel มีเอกสารอธิบายอยู่ในส่วนกฎของ Workspace ในBuild Encyclopedia และเอกสารประกอบเกี่ยวกับกฎของที่เก็บ 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++ กฎ A อาจมีกฎไลบรารี C++ อีกกฎหนึ่งคือกฎ B เป็นอินพุต ผลของการพึ่งพานี้คือไฟล์ส่วนหัวของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการคอมไพล์ สัญลักษณ์ของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการลิงก์ และข้อมูลรันไทม์ของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการดำเนินการ

สิ่งที่ไม่เปลี่ยนแปลงของกฎทั้งหมดคือไฟล์ที่สร้างขึ้นโดยกฎจะเป็นของแพ็กเกจเดียวกับกฎเสมอ คุณจะสร้างไฟล์ลงในแพ็กเกจอื่นไม่ได้ อย่างไรก็ตาม อินพุตของกฎอาจมาจากแพ็กเกจอื่นได้

กลุ่มแพ็กเกจคือชุดแพ็กเกจที่มีวัตถุประสงค์เพื่อจำกัดการเข้าถึงกฎบางอย่าง กลุ่มแพ็กเกจจะกำหนดโดยฟังก์ชัน package_group กลุ่มแพ็กเกจมี 3 พร็อพเพอร์ตี้ ได้แก่ รายการแพ็กเกจที่กลุ่มมี ชื่อของกลุ่ม และกลุ่มแพ็กเกจอื่นๆ ที่กลุ่มรวมไว้ วิธีเดียวที่อนุญาตให้อ้างอิงกลุ่มแพ็กเกจคือจากแอตทริบิวต์ visibility ของกฎหรือจากแอตทริบิวต์ default_visibility ของ ฟังก์ชัน package กลุ่มแพ็กเกจจะไม่สร้างหรือใช้ไฟล์ ดูข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบ package_group

ป้ายกำกับ