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

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

Workspace

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

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

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

ที่เก็บ

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

กฎของพื้นที่ทำงานที่รวมเข้ากับ 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 จะได้รับการประกาศด้วยกฎ อินสแตนซ์ของกฎแต่ละข้อจะระบุความสัมพันธ์ระหว่างชุดอินพุตและชุดไฟล์เอาต์พุต อินพุตของกฎอาจเป็นไฟล์ต้นฉบับ แต่ก็อาจเป็นเอาต์พุตของกฎอื่นๆ ด้วย

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

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

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

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

ป้ายกำกับ