ต่อไปนี้คือปัญหาและคำถามที่พบบ่อยเกี่ยวกับการเขียนส่วนขยาย
เหตุใดไฟล์จึงไม่สร้าง / ไม่ได้ดำเนินการบางอย่าง
Bazel จะดำเนินการที่จำเป็นในการสร้างไฟล์เอาต์พุตที่ร้องขอเท่านั้น
หากไฟล์ที่ต้องการมีป้ายกำกับ คุณก็ขอไฟล์ดังกล่าวได้โดยตรงโดยทำดังนี้
bazel build //pkg:myfile.txt
หากไฟล์อยู่ในกลุ่มเอาต์พุตของเป้าหมาย คุณอาจต้องระบุกลุ่มเอาต์พุตนั้นในบรรทัดคำสั่ง:
bazel build //pkg:mytarget --output_groups=foo
หากต้องการให้สร้างไฟล์โดยอัตโนมัติเมื่อมีการกล่าวถึงเป้าหมายในบรรทัดคำสั่ง ให้เพิ่มเป้าหมายลงในเอาต์พุตเริ่มต้นของกฎโดยแสดงผลผู้ให้บริการ
DefaultInfo
ดูข้อมูลเพิ่มเติมได้ที่หน้ากฎ
ทำไมระบบจึงไม่เรียกใช้ฟังก์ชันการใช้งานของฉัน
Bazel วิเคราะห์เฉพาะเป้าหมายที่ขอสำหรับบิลด์ คุณควรตั้งชื่อเป้าหมายในบรรทัดคำสั่งหรืออะไรก็ตามที่ขึ้นอยู่กับเป้าหมาย
ไฟล์หายไปเมื่อเรียกใช้การดำเนินการหรือไบนารีของฉัน
ตรวจสอบว่า 1) ลงทะเบียนไฟล์เป็นอินพุตของการดำเนินการหรือไบนารี และ 2) สคริปต์หรือเครื่องมือที่เรียกใช้มีการเข้าถึงไฟล์โดยใช้เส้นทางที่ถูกต้อง
สำหรับการดำเนินการ คุณจะประกาศอินพุตโดยส่งไปยังฟังก์ชัน ctx.actions.*
ที่สร้างการดำเนินการ คุณดูเส้นทางที่เหมาะสมสำหรับไฟล์ได้โดยใช้ File.path
สำหรับไบนารี (เอาต์พุตที่เรียกใช้ได้ซึ่งเรียกใช้โดยคำสั่ง bazel run
หรือ bazel test
) คุณจะประกาศอินพุตโดยรวมอินพุตไว้ใน Runfile แทนที่จะใช้ช่อง path
ให้ใช้ File.short_path
ซึ่งเป็นเส้นทางของไฟล์ที่เกี่ยวข้องกับไดเรกทอรี Runfiles ที่ไบนารีดำเนินการ
ฉันจะควบคุมไฟล์ที่ bazel build //pkg:mytarget
สร้างได้อย่างไร
ใช้ผู้ให้บริการ DefaultInfo
เพื่อตั้งค่าเอาต์พุตเริ่มต้น
ฉันจะเรียกใช้โปรแกรมหรือทำ I/O ไฟล์เป็นส่วนหนึ่งของบิลด์ได้อย่างไร
สามารถประกาศเครื่องมือเป็นเป้าหมายได้เช่นเดียวกับส่วนอื่นๆ ของบิลด์ และเรียกใช้ในระหว่างขั้นตอนการดำเนินการเพื่อช่วยสร้างเป้าหมายอื่นๆ หากต้องการสร้างการดำเนินการที่เรียกใช้เครื่องมือ ให้ใช้ ctx.actions.run
และส่งในเครื่องมือเป็นพารามิเตอร์ executable
ในระหว่างขั้นตอนการโหลดและการวิเคราะห์ เครื่องมือไม่สามารถทำงานหรือดำเนินการ I/O ไฟล์ได้ ซึ่งหมายความว่าเครื่องมือและเนื้อหาไฟล์ (ยกเว้นเนื้อหาของไฟล์ BUILD และ .bzl) จะไม่มีผลต่อวิธีสร้างกราฟเป้าหมายและกราฟการดำเนินการ
ฉันควรทำอย่างไรหากจำเป็นต้องเข้าถึงข้อมูลที่มีโครงสร้างเดียวกันทั้งก่อนและในระหว่างระยะการดำเนินการ
คุณจัดรูปแบบข้อมูลที่มีโครงสร้างเป็นไฟล์ .bzl ได้ คุณสามารถload()
ไฟล์เพื่อเข้าถึงไฟล์ดังกล่าวระหว่างขั้นตอนการโหลดและการวิเคราะห์ คุณสามารถส่งเป็นอินพุตหรือรันไฟล์ไปยังการดำเนินการและไฟล์ปฏิบัติการที่ต้องใช้ข้อมูลดังกล่าวในระยะการดำเนินการได้
ฉันควรบันทึกรหัส Starlark อย่างไร
สำหรับกฎและแอตทริบิวต์กฎ คุณจะส่งลิเทอรัลเป็นเอกสาร (อาจมีเครื่องหมายคำพูด 3 รายการ) ไปยังพารามิเตอร์ doc
ของ rule
หรือ attr.*()
ได้ สำหรับฟังก์ชันและมาโครตัวช่วย ให้ใช้ลิงก์สตริงเอกสารที่มีเครื่องหมายคำพูด 3 ตัวตามรูปแบบที่ให้ไว้ที่นี่
โดยทั่วไปแล้ว ฟังก์ชันการใช้กฎไม่จำเป็นต้องมีสตริงเอกสารของตัวเอง
การใช้ลิเทอรัลสตริงในที่ที่ต้องการช่วยให้เครื่องมืออัตโนมัติแยกเอกสารได้ง่ายขึ้น คุณสามารถใช้ความคิดเห็นมาตรฐานที่ไม่ใช่สตริง ในที่ใดก็ได้ที่อาจมีประโยชน์กับผู้อ่านโค้ด