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