ไฟล์ BUILD

ส่วนก่อนหน้านี้จะอธิบายแพ็กเกจ เป้าหมาย และป้ายกำกับ รวมถึงกราฟการอ้างอิงบิลด์แบบนามธรรม ส่วนนี้จะอธิบายไวยากรณ์ที่เป็นรูปธรรม ที่ใช้ในการกำหนดแพ็กเกจ

ตามคำจำกัดความแล้ว ทุกแพ็กเกจจะมีไฟล์ BUILD ซึ่งเป็นโปรแกรมสั้นๆ ไฟล์ BUILD รายการได้รับการประเมินโดยใช้ภาษาที่จำเป็น Starlark

ซึ่งจะตีความเป็นรายการคำสั่งตามลำดับ

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

เมื่อมีการเรียกใช้ฟังก์ชันของกฎการสร้าง เช่น cc_library ระบบจะสร้างเป้าหมายใหม่ในกราฟ คุณจะอ้างอิงเป้าหมายนี้ในภายหลังได้โดยใช้ป้ายกำกับ

ในไฟล์ BUILD แบบง่าย คุณจะจัดเรียงการประกาศกฎใหม่ได้อย่างอิสระโดยไม่ต้องเปลี่ยนลักษณะการทำงาน

เพื่อให้โค้ดและข้อมูลแยกกันอย่างชัดเจน ไฟล์ BUILD ต้องไม่มีคำจำกัดความของฟังก์ชัน คำสั่ง for หรือคำสั่ง if (แต่อนุญาตให้ใช้นิพจน์รายการและนิพจน์ if) คุณสามารถประกาศฟังก์ชันในไฟล์ .bzl แทน นอกจากนี้ ไม่อนุญาตให้ใช้อาร์กิวเมนต์ *args และ **kwargs ในไฟล์ BUILD แต่ให้ระบุอาร์กิวเมนต์ทั้งหมดอย่างชัดเจน

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

ไฟล์ BUILD ควรเขียนโดยใช้อักขระ ASCII เท่านั้น แม้ว่าในทางเทคนิคแล้วอาจมีการตีความโดยใช้ชุดอักขระ Latin-1 ก็ตาม

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

กำลังโหลดส่วนขยาย

นามสกุล Bazel คือไฟล์ที่ลงท้ายด้วย .bzl ใช้คำสั่ง load เพื่อนำเข้า สัญลักษณ์จากส่วนขยาย

load("//foo/bar:file.bzl", "some_library")

โค้ดนี้จะโหลดไฟล์ foo/bar/file.bzl และเพิ่มสัญลักษณ์ some_library ลงในสภาพแวดล้อม และสามารถใช้เพื่อโหลดกฎ ฟังก์ชัน หรือค่าคงที่ใหม่ๆ (เช่น สตริงหรือรายการ) ได้ คุณนำเข้าสัญลักษณ์ได้หลายรายการโดยใช้อาร์กิวเมนต์เพิ่มเติมในการเรียกไปยัง load อาร์กิวเมนต์ต้องเป็นสตริงลิเทอรัล (ไม่มีตัวแปร) และคำสั่ง load ต้องปรากฏที่ระดับบนสุด โดยต้องไม่อยู่ในเนื้อหาฟังก์ชัน

อาร์กิวเมนต์แรกของ load คือป้ายกำกับที่ระบุไฟล์ .bzl หากเป็นป้ายกำกับที่เกี่ยวข้อง ระบบจะแก้ไขปัญหาเกี่ยวกับแพ็กเกจ (ไม่ใช่ไดเรกทอรี) ที่มีไฟล์ bzl ปัจจุบัน ป้ายกำกับสัมพัทธ์ในคำสั่ง load ควรใช้ : นำหน้า

load ยังรองรับชื่อแทน คุณจึงตั้งชื่อที่แตกต่างกันให้กับสัญลักษณ์ที่นำเข้าได้

load("//foo/bar:file.bzl", library_alias = "some_library")

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

load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")

ในไฟล์ .bzl สัญลักษณ์ที่ขึ้นต้นด้วย _ จะไม่ส่งออกและโหลดจากไฟล์อื่นไม่ได้

คุณสามารถใช้การเปิดเผยการโหลดเพื่อจำกัดผู้ที่โหลดไฟล์ .bzl ได้

ประเภทของกฎการสร้าง

กฎการสร้างส่วนใหญ่มาจากครอบครัวที่จัดกลุ่มตามภาษา เช่น cc_binary, cc_library และ cc_test เป็นกฎการสร้างสำหรับไบนารีของ C++, ไลบรารี และการทดสอบตามลำดับ ภาษาอื่นๆ ใช้รูปแบบการตั้งชื่อเหมือนกันโดยมีคำนำหน้าที่ต่างกัน เช่น java_* สำหรับ Java ฟังก์ชันบางอย่างเหล่านี้ระบุไว้ในสร้างสารานุกรม แต่ทุกคนจะสร้างกฎใหม่ได้

  • กฎ *_binary จะสร้างโปรแกรมที่ดำเนินการได้ในภาษาหนึ่งๆ หลังจากการสร้าง ไฟล์ปฏิบัติการจะอยู่ในแผนผังเอาต์พุตแบบไบนารีของเครื่องมือสร้างตามชื่อที่สอดคล้องกันสำหรับป้ายกำกับของกฎ ดังนั้น //my:program จะปรากฏที่ (ตัวอย่างเช่น) $(BINDIR)/my/program

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

  • กฎ *_test เป็นความเชี่ยวชาญพิเศษของกฎ *_binary ซึ่งใช้สำหรับการทดสอบอัตโนมัติ การทดสอบคือโปรแกรมที่ให้ผลลัพธ์เป็นศูนย์

    การทดสอบก็จะมีโครงสร้าง Runfiles ด้วย เช่นเดียวกับไบนารี และไฟล์ที่อยู่ข้างใต้เป็นเพียงไฟล์เดียวที่การทดสอบจะเปิดได้ขณะรันไทม์ ตัวอย่างเช่น โปรแกรม cc_test(name='x', data=['//foo:bar']) อาจเปิดและอ่าน $TEST_SRCDIR/workspace/foo/bar ระหว่างการดำเนินการ (ภาษาโปรแกรมแต่ละภาษามีฟังก์ชันยูทิลิตีของตัวเองสำหรับการเข้าถึงค่าของ $TEST_SRCDIR แต่เทียบเท่ากับการใช้ตัวแปรสภาพแวดล้อมโดยตรง) การไม่ปฏิบัติตามกฎจะทำให้การทดสอบล้มเหลวเมื่อเรียกใช้ในโฮสต์การทดสอบระยะไกล

  • กฎ *_library จะระบุโมดูลที่คอมไพล์แยกกันในภาษาโปรแกรมที่ระบุ ไลบรารีอาจขึ้นอยู่กับไลบรารีอื่นๆ ส่วนไบนารีและการทดสอบอาจขึ้นอยู่กับไลบรารีด้วยลักษณะการทำงานของการคอมไพล์แยกต่างหากที่คาดไว้

ป้ายกำกับ ทรัพยากร Dependency