ปัญหาและคำถามที่พบบ่อยเกี่ยวกับการเขียนส่วนขยายมีดังนี้
เหตุใดจึงไม่มีการสร้างไฟล์ / ไม่เคยมีการดำเนินการ
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) จะไม่ส่งผลต่อวิธีสร้างกราฟเป้าหมายและการดำเนินการ
จะเกิดอะไรขึ้นหากฉันต้องการเข้าถึง Structured Data เดียวกันทั้งก่อนและระหว่างระยะการดำเนินการ
คุณจัดรูปแบบ Structured Data เป็นไฟล์ .bzl ได้ คุณload()
ไฟล์เพื่อเข้าถึงไฟล์ระหว่างระยะการโหลดและการวิเคราะห์ได้ คุณสามารถส่งเป็นอินพุตหรือ
runfile ไปยังการดำเนินการและไฟล์ที่เรียกใช้งานได้ซึ่งต้องการไฟล์นี้ในระหว่างระยะการดำเนินการ
ฉันควรจัดทำเอกสารโค้ด Starlark อย่างไร
สำหรับกฎและแอตทริบิวต์ของกฎ คุณสามารถส่งอักษรตามที่ระบุในสตริงเอกสาร (อาจเป็นแบบ
มีเครื่องหมายคำพูด 3 ตัว) ไปยังพารามิเตอร์ doc
ของ rule
หรือ attr.*()
สำหรับฟังก์ชันและมาโครตัวช่วย ให้ใช้สตริงเอกสารแบบอักษรตามรูปแบบที่ระบุที่นี่
โดยทั่วไปแล้ว ฟังก์ชันการใช้งานกฎไม่จำเป็นต้องมีสตริงเอกสารของตัวเอง
การใช้สตริงลิเทอรัลในตำแหน่งที่คาดไว้จะช่วยให้เครื่องมืออัตโนมัติ ดึงข้อมูลเอกสารได้ง่ายขึ้น คุณใช้ความคิดเห็นมาตรฐานที่ไม่ใช่สตริงได้ ในทุกที่ที่อาจช่วยผู้อ่านโค้ด