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

รายงานปัญหา ดูแหล่งที่มา /3} /4} {3/4} {3/4} {3/4} {3/4} /4.

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

Workspace

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

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

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

ที่เก็บ

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

กฎพื้นที่ทำงานที่มาพร้อมกับ Bazel จะได้รับการระบุบันทึกไว้ในส่วนกฎ Workspace ในสารานุกรมและเอกสารประกอบเกี่ยวกับกฎที่เก็บ Starlark แบบฝัง

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

กล่องพัสดุ

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

แพ็กเกจได้รับการระบุเป็นไดเรกทอรีที่มีไฟล์ 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 สำหรับอินพุต ผลกระทบของทรัพยากร Dependency นี้ คือ ไฟล์ส่วนหัวของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการคอมไพล์ สัญลักษณ์ B จะพร้อมใช้งานสำหรับ A ในระหว่างการลิงก์และข้อมูลรันไทม์ของ B จะพร้อมใช้งานสำหรับ A ในระหว่างการดำเนินการ

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

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

ป้ายกำกับ