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

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

เหตุใดจึงไม่มีการสร้างไฟล์ / ไม่เคยมีการดำเนินการ

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.*() สำหรับฟังก์ชันและมาโครตัวช่วย ให้ใช้สตริงเอกสารแบบอักษรตามรูปแบบที่ระบุที่นี่ โดยทั่วไปแล้ว ฟังก์ชันการใช้งานกฎไม่จำเป็นต้องมีสตริงเอกสารของตัวเอง

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