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

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

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

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

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

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

ที่เก็บ

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

ดูกฎพื้นที่ทํางานที่มาพร้อมกับ Bazel ได้ในส่วนกฎของพื้นที่ทํางานในบิลด์บิลด์และเอกสารในที่เก็บ Starlark แบบฝัง กฎ

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

แพ็กเกจ

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

แพ็กเกจหมายถึงไดเรกทอรีที่มีไฟล์ชื่อ BUILD (หรือ BUILD.bazel) แพ็กเกจจะประกอบไปด้วยไฟล์ทั้งหมดในไดเรกทอรี รวมถึงไดเรกทอรีย่อยทั้งหมดที่อยู่ใต้โฟลเดอร์นั้น ยกเว้นไฟล์ที่ตนเองมีไฟล์ BUILD อยู่ จากคําจํากัดความนี้ ไฟล์หรือไดเรกทอรีอาจไม่ได้อยู่ในแพ็กเกจเดียวกัน

ตัวอย่างเช่น ในโครงสร้างไดเรกทอรีต่อไปนี้มีแพ็กเกจ 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

ป้ายกํากับ