อย่าลืมนัดของเรา: BazelCon 2023 จะจัดขึ้นในวันที่ 24-25 ตุลาคมที่ Google ที่มิวนิก ดูข้อมูลเพิ่มเติม

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

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

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

Workspace

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

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

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

ที่เก็บ

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

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

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

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

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

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

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

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

ป้ายกํากับ