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

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

เป้าหมาย

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

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

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

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

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

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

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

ป้ายกำกับ