คำถามที่พบบ่อย

นี่คือปัญหาและคำถามที่พบบ่อยเกี่ยวกับการเขียนส่วนขยาย

เหตุใดระบบจึงไม่สร้างไฟล์หรือไม่มีการดำเนินการตามที่ฉันสั่ง

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 ให้ใช้ File.short_pathแทนช่องpathซึ่งเป็นเส้นทางของไฟล์ที่สัมพันธ์กับ ไดเรกทอรีไฟล์ที่เรียกใช้งานซึ่งไบนารีเรียกใช้งาน

ฉันจะควบคุมไฟล์ที่ bazel build //pkg:mytarget สร้างได้อย่างไร

ใช้ผู้ให้บริการ DefaultInfo เพื่อ ตั้งค่าเอาต์พุตเริ่มต้น

ฉันจะเรียกใช้โปรแกรมหรือดำเนินการ I/O ของไฟล์เป็นส่วนหนึ่งของการสร้างได้อย่างไร

คุณสามารถประกาศเครื่องมือเป็นเป้าหมายได้เช่นเดียวกับส่วนอื่นๆ ของการสร้าง และเรียกใช้เครื่องมือในระยะการดำเนินการเพื่อช่วยสร้างเป้าหมายอื่นๆ หากต้องการสร้างการดำเนินการ ที่เรียกใช้เครื่องมือ ให้ใช้ ctx.actions.run และส่งเครื่องมือ เป็นพารามิเตอร์ executable

ในระยะการโหลดและการวิเคราะห์ เครื่องมือ ไม่สามารถ ทำงานได้ และคุณก็ไม่สามารถดำเนินการ I/O ของไฟล์ได้ ซึ่งหมายความว่าเครื่องมือและเนื้อหาของไฟล์ (ยกเว้นเนื้อหาของไฟล์ BUILD และ .bzl) จะไม่ส่งผลต่อวิธีสร้างกราฟเป้าหมายและการดำเนินการ

ฉันควรทำอย่างไรหากต้องการเข้าถึงข้อมูลที่มีโครงสร้างเดียวกันทั้งก่อนและระหว่างระยะการดำเนินการ

คุณสามารถจัดรูปแบบข้อมูลที่มีโครงสร้างเป็นไฟล์ .bzl ได้ และสามารถใช้คำสั่ง load() เพื่อเข้าถึงไฟล์ในระยะการโหลดและการวิเคราะห์ นอกจากนี้ยังส่งไฟล์เป็นอินพุตหรือไฟล์ที่เรียกใช้งานไปยังการดำเนินการและไฟล์ที่เรียกใช้งานได้ที่ต้องการไฟล์ดังกล่าวในระยะการดำเนินการได้ด้วย

ฉันควรจัดทำเอกสารประกอบสำหรับโค้ด Starlark อย่างไร

สำหรับกฎและแอตทริบิวต์ของกฎ คุณสามารถส่งตัวอักษร docstring (อาจเป็นแบบมีเครื่องหมายคำพูด 3 ตัว) ไปยังพารามิเตอร์ doc ของ rule หรือ attr.*() สำหรับฟังก์ชันและมาโครตัวช่วย ให้ใช้ตัวอักษร docstring แบบมีเครื่องหมายคำพูด 3 ตัวตามรูปแบบที่ระบุไว้ที่นี่ โดยทั่วไปแล้วฟังก์ชันการใช้งานกฎไม่จำเป็นต้องมี docstring ของตัวเอง

การใช้ตัวอักษรสตริงในตำแหน่งที่คาดไว้จะช่วยให้เครื่องมืออัตโนมัติแยกเอกสารประกอบได้ง่ายขึ้น คุณสามารถใช้ความคิดเห็นที่ไม่ใช่สตริงมาตรฐานได้ทุกที่ที่อาจเป็นประโยชน์ต่อผู้อ่านโค้ด