ไฟล์ BUILD

รายงานปัญหา ดูแหล่งที่มา

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

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