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

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

ที่เก็บ

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

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

พื้นที่ทำงาน

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

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

แพ็กเกจ

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

แพ็กเกจกำหนดเป็นไดเรกทอรีที่มีไฟล์ 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

ป้ายกำกับ