ไฟล์ BUILD

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

ตามคำจำกัดความแล้ว ทุกแพ็กเกจจะมีไฟล์ BUILD ซึ่งเป็นไฟล์สั้นๆ ของโปรแกรม

BUILD ไฟล์จะได้รับการประเมินโดยใช้ภาษาพิเศษ Starlark

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

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

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

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

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

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

ควรเขียนไฟล์ BUILD โดยใช้เฉพาะอักขระ ASCII เท่านั้น ในทางเทคนิคจะมีการแปลความหมายด้วยชุดอักขระละติน-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

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

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

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

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

ป้ายกำกับ การขึ้นต่อกัน