ส่วนก่อนหน้านี้อธิบายแพ็กเกจ เป้าหมาย และป้ายกํากับ และกราฟการใช้ทรัพยากร Dependency เชิงนามธรรม ส่วนนี้จะอธิบายไวยากรณ์ที่เป็นรูปธรรม ที่ใช้กําหนดแพ็กเกจ
ตามคําจํากัดความแล้ว ทุกแพ็กเกจจะมีไฟล์ BUILD
ซึ่งเป็นโปรแกรมสั้นๆ
ไฟล์ BUILD
รายการได้รับการประเมินโดยใช้ภาษาที่จําเป็น ได้แก่ Starlark
ซึ่งมีการตีความว่าเป็นรายการข้อความตามลําดับ
โดยทั่วไปแล้ว ลําดับเป็นสิ่งสําคัญ: ต้องกําหนดตัวแปรก่อนใช้ เป็นต้น แต่ไฟล์ BUILD
ส่วนใหญ่จะมีเฉพาะการประกาศของกฎการสร้าง และลําดับที่เกี่ยวข้องของคําสั่งเหล่านี้เป็น immaterial ทั้งหมดที่สําคัญคือมีการประกาศ กฎ และค่าใด โดยใช้เมื่อการประเมินแพ็กเกจเสร็จสมบูรณ์
เมื่อเรียกใช้ฟังก์ชันของกฎบิวด์ เช่น cc_library
จะเป็นการสร้างเป้าหมายใหม่ในกราฟ ป้ายกํากับนี้อาจมีการอ้างอิงโดยใช้ป้ายกํากับในภายหลัง
ในไฟล์ BUILD
ที่เรียบง่าย ประกาศกฎจะเรียงลําดับใหม่ได้อย่างอิสระโดยไม่เปลี่ยนลักษณะการทํางาน
ไฟล์ BUILD
ต้องไม่มีคําจํากัดความของฟังก์ชัน, คําสั่ง for
หรือคําสั่ง if
(อนุญาตให้ใช้ความเข้าใจแบบรายการและนิพจน์ if
) เพื่อการแยกโค้ดและข้อมูลออกจากกัน คุณประกาศฟังก์ชันในไฟล์ .bzl
แทนได้ นอกจากนี้ ไม่อนุญาตให้ใช้อาร์กิวเมนต์ *args
และ **kwargs
ใน BUILD
ไฟล์ ให้ระบุอาร์กิวเมนต์ทั้งหมดอย่างชัดเจน
โปรแกรมใน Starlark ไม่สามารถทํา I/O ที่กําหนดเองได้ ตัวแปรนี้ทําให้การแปลความหมายของไฟล์ BUILD
เป็นไปอย่างราบรื่น โดยขึ้นอยู่กับชุดอินพุตที่รู้จักเท่านั้น ซึ่งเป็นสิ่งสําคัญต่อการสร้างบิวด์ให้ทําซ้ําได้
โปรดดูรายละเอียดเพิ่มเติมที่การอยู่ร่วมกัน
ควรเขียนไฟล์ BUILD
ไฟล์โดยใช้อักขระ ASCII เท่านั้น แม้ว่าในทางเทคนิคแล้วไฟล์เหล่านั้นจะได้รับการแปลโดยใช้ชุดอักขระละติน-1
เนื่องจากต้องมีการอัปเดตไฟล์ BUILD
เมื่อใดก็ตามที่การขึ้นต่อกันของการเปลี่ยนแปลงโค้ดที่มีอยู่ ระบบจึงคงการดูแลทีมหลายคนในทีม ผู้เขียนไฟล์ 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
1 รายการ นอกจากนี้ รายการอาร์กิวเมนต์
อาจมีทั้งชื่อแทนและชื่อสัญลักษณ์ทั่วไป ตัวอย่างต่อไปนี้คือกฎหมายที่ถูกต้องตามกฎหมาย (โปรดทราบว่าเมื่อใดควรใช้เครื่องหมายคําพูด)
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
ที่เป็นของกฎ หรือกฎใดๆ ในการปิด Dependencies เหล่านี้ ไฟล์ชุดนี้จะถูกรวบรวมไว้ในที่เดียวเพื่อให้ติดตั้งใช้งานได้ง่ายกฎ
*_test
เป็นความเชี่ยวชาญพิเศษของกฎ*_binary
ซึ่งใช้สําหรับการทดสอบอัตโนมัติ การทดสอบเป็นเพียงโปรแกรมที่ให้ผลลัพธ์เป็นศูนย์เช่นเดียวกับไบนารี การทดสอบก็มีโครงสร้างไฟล์ และไฟล์ก็เป็นเพียงไฟล์เดียวที่การทดสอบอาจเปิดอย่างถูกต้องขณะรันไทม์ ตัวอย่างเช่น โปรแกรม
cc_test(name='x', data=['//foo:bar'])
อาจเปิดและอ่าน$TEST_SRCDIR/workspace/foo/bar
ระหว่างดําเนินการ (ภาษาการเขียนโปรแกรมแต่ละภาษามีฟังก์ชันยูทิลิตีของตนเองสําหรับการเข้าถึงค่า$TEST_SRCDIR
แต่ทุกค่าเทียบเท่ากับการใช้ตัวแปรสภาพแวดล้อมโดยตรง) การไม่สังเกตกฎจะทําให้การทดสอบล้มเหลวเมื่อมีการดําเนินการกับโฮสต์การทดสอบระยะไกลกฎ
*_library
ระบุโมดูลที่คอมไพล์แยกกันในภาษาการเขียนโปรแกรม ไลบรารีอาจขึ้นอยู่กับไลบรารีอื่นๆ และไบนารีและการทดสอบอาจขึ้นอยู่กับไลบรารี ด้วยลักษณะการคอมไพล์แยกต่างหากตามที่คาดหวัง
ป้ายกํากับ | การขึ้นต่อกัน |