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

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

Workspace

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

ไดเรกทอรีที่มีไฟล์ชื่อ WORKSPACE จะถือว่าเป็นรูทของพื้นที่ทำงาน ดังนั้น Bazel จึงละเว้นต้นไม้ไดเรกทอรีในพื้นที่ทํางานที่รูทอยู่ที่ไดเรกทอรีย่อยที่มีไฟล์ WORKSPACE เนื่องจากเป็นพื้นที่ทํางานอื่น

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

ที่เก็บ

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

กฎของ Workspace ที่รวมอยู่กับ Bazel มีอยู่ในหัวข้อกฎของ Workspace ในสารานุกรมการสร้างและเอกสารประกอบเกี่ยวกับกฎของที่เก็บ Starlark ที่ฝัง

เนื่องจากที่เก็บข้อมูลภายนอกเป็นที่เก็บข้อมูลด้วยเช่นกัน จึงมักจะมีไฟล์ WORKSPACE ด้วย อย่างไรก็ตาม Bazel จะละเว้นไฟล์ WORKSPACE เพิ่มเติมเหล่านี้ โดยเฉพาะอย่างยิ่ง ระบบจะไม่เพิ่มที่เก็บข้อมูลที่พึ่งพากันโดยอ้อมโดยอัตโนมัติ

แพ็กเกจ

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

แพ็กเกจหมายถึงไดเรกทอรีที่มีไฟล์ชื่อ 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 ของแพ็กเกจ เป้าหมายส่วนใหญ่มี 2 ประเภทหลักๆ ได้แก่ ไฟล์และกฎ

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

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

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

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

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

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

ป้ายกำกับ