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

รายงานปัญหา ดูแหล่งที่มา รุ่น Nightly · 7.4

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

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

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

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

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

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

ป้ายกำกับ