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

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

ที่เก็บ

ไฟล์ต้นฉบับที่ใช้ในบิลด์ Bazel จะได้รับการจัดระเบียบในที่เก็บ (มักย่อเป็นที่เก็บ) Repo คือแผนผังไดเรกทอรีที่มีไฟล์เครื่องหมายขอบเขตที่รูท โดยไฟล์เครื่องหมายขอบเขตดังกล่าวอาจเป็น MODULE.bazel, REPO.bazel หรือในบริบทเดิม WORKSPACE หรือ WORKSPACE.bazel

ที่เก็บที่คำสั่ง Bazel ปัจจุบันกำลังทำงานอยู่เรียกว่าที่เก็บหลัก ส่วนที่เหลือ (ภายนอก) จะกำหนดโดยกฎของที่เก็บ ดูข้อมูลเพิ่มเติมได้ที่ภาพรวมของ การอ้างอิงภายนอก

Workspace

พื้นที่ทำงานคือสภาพแวดล้อมที่คำสั่ง Bazel ทั้งหมดใช้ร่วมกันซึ่งทำงานจากที่เก็บหลักเดียวกัน ซึ่งครอบคลุมทั้งที่เก็บหลักและชุดที่เก็บภายนอกทั้งหมดที่กำหนดไว้

โปรดทราบว่าที่ผ่านมาแนวคิด "ที่เก็บข้อมูล" และ "พื้นที่ทำงาน" มักใช้รวมๆ กัน คำว่า "พื้นที่ทำงาน" มักใช้เพื่ออ้างอิงถึงที่เก็บข้อมูลหลัก และบางครั้งยังใช้เป็นคำพ้องความหมายของ "ที่เก็บข้อมูล" ด้วย

แพ็กเกจ

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

แพ็กเกจจะกำหนดเป็นไดเรกทอรีที่มี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 ประเภท โดยปกติแล้ว Source files จะเขียนขึ้นจาก ความพยายามของผู้คนและเช็คอินไปยังที่เก็บ ไฟล์ที่สร้างขึ้น บางครั้งเรียกว่าไฟล์ที่ได้มาหรือไฟล์เอาต์พุต ไม่ได้เช็คอิน แต่ สร้างขึ้นจากไฟล์ต้นฉบับ

เป้าหมายประเภทที่ 2 ประกาศด้วยกฎ อินสแตนซ์ของกฎแต่ละรายการ จะระบุความสัมพันธ์ระหว่างชุดไฟล์อินพุตกับชุดไฟล์เอาต์พุต อินพุตของกฎอาจเป็นไฟล์ต้นฉบับ แต่ก็อาจเป็นเอาต์พุตของกฎอื่นๆ ด้วย

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

อินพุตของกฎอาจรวมถึงกฎอื่นๆ ด้วย ความหมายที่แน่นอนของความสัมพันธ์ดังกล่าวมักจะซับซ้อนมากและขึ้นอยู่กับภาษาหรือกฎ แต่โดยสัญชาตญาณแล้วก็ง่ายๆ คือ กฎไลบรารี C++ กฎ A อาจมีกฎไลบรารี C++ อีกกฎหนึ่งคือกฎ B สำหรับอินพุต ผลกระทบของการอ้างอิงนี้คือไฟล์ส่วนหัวของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการคอมไพล์ สัญลักษณ์ของ B จะพร้อมใช้งานสำหรับ A ในระหว่าง การลิงก์ และข้อมูลรันไทม์ของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการดำเนินการ

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

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

ป้ายกำกับ