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

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

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

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

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

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

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

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

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

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

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

ฉันควรบันทึกโค้ด Starlark อย่างไร

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

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