ส่วนก่อนหน้านี้จะอธิบายแพ็กเกจ เป้าหมาย และป้ายกำกับ รวมถึงกราฟการอ้างอิงบิลด์แบบนามธรรม ส่วนนี้จะอธิบายไวยากรณ์ที่เป็นรูปธรรม ที่ใช้ในการกำหนดแพ็กเกจ
ตามคำจำกัดความแล้ว ทุกแพ็กเกจจะมีไฟล์ 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 |