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

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

Workspace

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

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

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

ที่เก็บ

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

กฎพื้นที่ทำงานที่รวมอยู่ใน Bazel จะได้รับการบันทึกในส่วนกฎพื้นที่ทำงานในส่วน Build Encyclopedia และเอกสารประกอบเกี่ยวกับกฎที่เก็บของ 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

เป้าหมาย

แพ็กเกจคือคอนเทนเนอร์ของ targets ซึ่งกำหนดไว้ในไฟล์ BUILD ของแพ็กเกจ เป้าหมายส่วนใหญ่เป็น 1 ใน 2 ประเภทหลัก ได้แก่ ไฟล์และกฎ

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

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

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

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

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

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

ป้ายกำกับ