ต่อไปนี้คือปัญหาและคำถามที่พบบ่อยเกี่ยวกับการเขียนส่วนขยาย
เหตุใดจึงไม่มีการสร้างไฟล์ของฉัน / ฉันไม่เคยดำเนินการกับไฟล์ของฉันเลย
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 เป็นของตัวเอง
การใช้สตริงลิเทอรัลในตำแหน่งที่คาดหวังจะช่วยให้เครื่องมืออัตโนมัติดึงเอกสารออกมาง่ายขึ้น คุณสามารถใช้ความคิดเห็นมาตรฐานที่ไม่ใช่สตริงได้ในทุกที่ที่อาจช่วยผู้อ่านโค้ดได้