ในตัวอย่างต่อไปนี้ เครื่องโฮสต์คือเครื่องที่ Bazel ทำงาน
เมื่อใช้การดำเนินการระยะไกล บิลด์และ/หรือขั้นตอนการทดสอบจริงจะไม่ปรากฏในเครื่องโฮสต์ แต่จะส่งไปยังระบบการดำเนินการระยะไกลแทน อย่างไรก็ตาม ขั้นตอนที่เกี่ยวข้องกับการแก้ไขกฎพื้นที่ทำงานจะเกิดขึ้นในเครื่องโฮสต์ หากกฎพื้นที่ทำงานเข้าถึงข้อมูลเกี่ยวกับเครื่องโฮสต์เพื่อใช้ในระหว่างการดำเนินการ บิลด์ของคุณมีแนวโน้มที่จะหยุดทำงานเนื่องจากความไม่เข้ากันระหว่างสภาพแวดล้อม
ในการปรับเปลี่ยนกฎ Bazel สำหรับการดำเนินการระยะไกล คุณต้องหากฎพื้นที่ทำงานดังกล่าวและแก้ไข หน้านี้จะอธิบายวิธีค้นหากฎพื้นที่ทำงานที่อาจเป็นปัญหาโดยใช้บันทึกของพื้นที่ทำงาน
หากฎที่ไม่ใช่อนุภาค
กฎพื้นที่ทำงานช่วยให้นักพัฒนาซอฟต์แวร์เพิ่มทรัพยากร Dependency ไปยังพื้นที่ทำงานภายนอกได้ แต่กฎเหล่านี้มีข้อมูลเพียงพอที่จะทำให้มีการประมวลผลที่กำหนดเองในระหว่างนี้ คำสั่งที่เกี่ยวข้องทั้งหมดจะเกิดขึ้นภายในเครื่องและอาจเป็นแหล่ง
ที่อาจทำให้เกิดความไม่สบายใจ โดยปกติแล้วลักษณะการทำงานที่ไม่ใช่แบบผลัดเซลล์จะทำผ่าน repository_ctx
ซึ่งอนุญาตให้โต้ตอบกับเครื่องโฮสต์ได้
ตั้งแต่ Bazel 0.18 เป็นต้นไป คุณจะรับบันทึกการดำเนินการที่อาจไม่ใช่ลมคว่ำได้โดยการเพิ่มแฟล็ก --experimental_workspace_rules_log_file=[PATH]
ลงในคำสั่ง Bazel ในที่นี้ [PATH]
คือชื่อไฟล์ที่จะใช้สร้างบันทึก
สิ่งที่ควรทราบ
ไฟล์บันทึกจะบันทึกเหตุการณ์ขณะที่ดำเนินการ หากบางขั้นตอนมีการแคชไว้ ขั้นตอนเหล่านั้นจะไม่แสดงในบันทึก ดังนั้นเพื่อให้ได้ผลลัพธ์ที่สมบูรณ์ อย่าลืมเรียกใช้
bazel clean --expunge
ล่วงหน้าบางครั้งอาจมีการเรียกใช้ฟังก์ชันอีกครั้ง ซึ่งในกรณีนี้เหตุการณ์ที่เกี่ยวข้องจะปรากฏในบันทึกหลายครั้ง
ขณะนี้กฎ Workspace จะบันทึกเฉพาะเหตุการณ์ Starlark เท่านั้น
วิธีค้นหาสิ่งที่ดำเนินการระหว่างการเริ่มต้นพื้นที่ทำงาน
เรียกใช้
bazel clean --expunge
คำสั่งนี้จะล้างแคชในเครื่องและที่เก็บที่แคชไว้ทั้งหมด เพื่อให้มั่นใจว่าการเริ่มต้นทั้งหมดจะทำงานอีกครั้งเพิ่ม
--experimental_workspace_rules_log_file=/tmp/workspacelog
ลงในคำสั่ง Baiel แล้วเรียกใช้บิลด์ซึ่งจะสร้างไฟล์ไบนารีที่มีรายการข้อความประเภท WorkspaceEvent
ดาวน์โหลดซอร์สโค้ด Bazel และไปที่โฟลเดอร์ Bazel โดยใช้คำสั่งด้านล่าง คุณต้องมีซอร์สโค้ดจึงจะแยกวิเคราะห์บันทึกพื้นที่ทำงานด้วยโปรแกรมแยกวิเคราะห์ workspacelog ได้
git clone https://github.com/bazelbuild/bazel.git
cd bazel
ในที่เก็บซอร์สโค้ดของ Bazel ให้แปลงบันทึกพื้นที่ทำงานทั้งหมดเป็นข้อความ
bazel build src/tools/workspacelog:parser
bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog > /tmp/workspacelog.txt
เอาต์พุตที่ได้อาจค่อนข้างละเอียดและมีเอาต์พุตจากกฎ Bazel ในตัว
หากต้องการยกเว้นกฎที่เฉพาะเจาะจงจากเอาต์พุต ให้ใช้ตัวเลือก
--exclude_rule
เช่นbazel build src/tools/workspacelog:parser
bazel-bin/src/tools/workspacelog/parser --log_path=/tmp/workspacelog \ --exclude_rule "//external:local_config_cc" \ --exclude_rule "//external:dep" > /tmp/workspacelog.txt
เปิด
/tmp/workspacelog.txt
และตรวจหาการดำเนินการที่ไม่ปลอดภัย
บันทึกประกอบด้วยข้อความ WorkspaceEvent ซึ่งระบุถึงการดำเนินการบางอย่างที่อาจไม่ใช่ฟีดแบ็กที่ดำเนินการใน repository_ctx
การดำเนินการที่มีการไฮไลต์ว่าอาจไม่เป็นแบบเต็มมีดังนี้
execute
: ใช้คำสั่งที่กำหนดเองในสภาพแวดล้อมของโฮสต์ ตรวจสอบว่ารายการเหล่านี้อาจทำให้เกิดทรัพยากร Dependency บนสภาพแวดล้อมของโฮสต์หรือไม่download
,download_and_extract
: ตรวจสอบว่าได้ระบุ sha256 แล้วเพื่อให้บิลด์ที่แยกแต่ละรายการสมบูรณ์file
,template
: พารามิเตอร์นี้ไม่ใช่แบบผลึกในตัวเอง แต่อาจเป็นกลไกในการนำทรัพยากร Dependency ของสภาพแวดล้อมโฮสต์ไปยังที่เก็บ โปรดตรวจสอบว่าคุณเข้าใจว่าอินพุตมาจากที่ใด และไม่ขึ้นอยู่กับสภาพแวดล้อมของโฮสต์os
: ซึ่งไม่ใช่ค่าผสมแบบผกผันในตัวเอง แต่เป็นวิธีง่ายๆ ในการรับทรัพยากร Dependency ในสภาพแวดล้อมโฮสต์ โดยทั่วไป บิลด์ที่ไม่เป็นธรรมชาติจะไม่เรียกสิ่งนี้ ในการประเมินว่าการใช้งานของคุณเป็นไปอย่างราบรื่นหรือไม่ โปรดทราบว่าการดำเนินการนี้จะทำงานบนโฮสต์ ไม่ใช่สำหรับผู้ปฏิบัติงาน การรับข้อมูลเฉพาะสภาพแวดล้อมจากโฮสต์มักไม่ใช่ความคิดที่ดีสำหรับบิลด์ระยะไกลsymlink
: ปกติแล้วปลอดภัย แต่ให้มองหาธงสีแดง ลิงก์สัญลักษณ์ภายนอกที่เก็บหรือเส้นทางสัมบูรณ์จะทำให้เกิดปัญหากับผู้ปฏิบัติงานระยะไกล หากสร้างลิงก์สัญลักษณ์ตามคุณสมบัติของเครื่องโฮสต์ ก็อาจทำให้เกิดปัญหาได้เช่นกันwhich
: การตรวจหาโปรแกรมที่ติดตั้งในโฮสต์มักมีปัญหาเนื่องจากผู้ปฏิบัติงานอาจมีการกำหนดค่าที่แตกต่างออกไป