สมุนไพร

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.4 ที่ใช้เวลาเพียง 2 นาที 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

ภาพรวม

เมื่อได้รับซอร์สโค้ดอินพุตและการกำหนดค่าผลิตภัณฑ์เดียวกัน ระบบบิลด์แบบปิดผนึกจะแสดงผลลัพธ์เดียวกันเสมอโดยการแยกบิลด์ออกจากการเปลี่ยนแปลงในระบบโฮสต์

ในการแยกแยะบิลด์ บิลด์ที่รวมกันได้อย่างอิสระจึงไม่คำนึงถึงไลบรารีและ ซอฟต์แวร์อื่นที่ติดตั้งในเครื่องโฮสต์ภายในหรือระยะไกล ขึ้นอยู่กับ เวอร์ชันที่เจาะจงของเครื่องมือบิลด์ เช่น คอมไพเลอร์และทรัพยากร Dependency เช่น ห้องสมุด วิธีนี้ทำให้กระบวนการบิลด์เป็นแบบในตัวเนื่องจากไม่ต้องพึ่งพา บริการภายนอกสภาพแวดล้อมของบิลด์

องค์ประกอบสำคัญ 2 ประการของความไม่สละสลวยคือ:

  • การแยกส่วน: ระบบการบิลด์แบบปิดผนึกจะถือว่าเครื่องมือเป็นซอร์สโค้ด โฆษณาเหล่านี้ ดาวน์โหลดสำเนาเครื่องมือและจัดการพื้นที่เก็บข้อมูลและใช้งานภายในไฟล์ที่มีการจัดการ ต้นไม้ ซึ่งจะแยกระหว่างเครื่องโฮสต์กับผู้ใช้ในเครื่อง รวมถึงภาษาเวอร์ชันที่ติดตั้งไว้
  • ข้อมูลประจำตัวต้นทาง: ระบบบิลด์ที่สัญชาติญาณพยายามตรวจสอบความตรงกันของ อินพุต ที่เก็บโค้ด เช่น Git จะระบุชุดการเปลี่ยนแปลงโค้ดด้วย รหัสแฮชที่ไม่ซ้ำกัน ระบบบิลด์ที่ไม่ซับซ้อนจะใช้แฮชนี้เพื่อระบุการเปลี่ยนแปลงของ อินพุตของบิลด์

ประโยชน์

ประโยชน์หลักๆ ของบิลด์แบบปิดผนึก ได้แก่

  • ความเร็ว: ระบบแคชเอาต์พุตของการดำเนินการได้ และไม่จำเป็นต้องบันทึกการดำเนินการดังกล่าว ทำงานอีกครั้ง เว้นแต่อินพุตจะเปลี่ยนแปลง
  • การดำเนินการแบบขนาน: สำหรับอินพุตและเอาต์พุตที่ระบุ ระบบบิลด์สามารถสร้างกราฟของการดำเนินการทั้งหมดเพื่อคำนวณการดำเนินการแบบขนานที่มีประสิทธิภาพ ระบบบิลด์จะโหลดกฎและคำนวณกราฟการดำเนินการ และแฮชที่ต้องการในการค้นหาในแคช
  • บิลด์หลายรายการ: คุณสามารถสร้างบิลด์แบบปิดผนึกหลายรายการในเครื่องเดียวกัน โดยแต่ละบิลด์จะใช้เครื่องมือและเวอร์ชันที่แตกต่างกัน
  • ความสามารถในการทำซ้ำ: บิลด์ที่สับเปลี่ยนได้เหมาะกับการแก้ปัญหาเนื่องจากคุณ รู้เงื่อนไขที่แน่ชัดในการสร้างสิ่งที่สร้างขึ้น

การระบุความไม่เป็นธรรมชาติ

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

  • การประมวลผลที่กำหนดเองในไฟล์ .mk รายการ
  • การดำเนินการหรือการใช้เครื่องมือที่สร้างไฟล์โดยไม่มีการกำหนด ซึ่งมักเกี่ยวข้องกับ รหัสหรือการประทับเวลาของบิลด์
  • ไบนารีของระบบที่แตกต่างกันในโฮสต์ต่างๆ (เช่น ไบนารี /usr/bin แบบสัมบูรณ์ เส้นทาง คอมไพเลอร์ C++ ของระบบสำหรับการกำหนดค่ากฎ C++ แบบเนทีฟ)
  • กำลังเขียนไปยังแผนผังต้นทางระหว่างการสร้าง ซึ่งจะช่วยป้องกันไม่ให้ใช้ซอร์สโค้ดเดียวกันกับเป้าหมายอื่น บิลด์แรกจะเขียนลงในซอร์สทรี โดยแก้ไขซอร์สทรีสําหรับเป้าหมาย ก. จากนั้นการพยายามสร้างเป้าหมาย ข อาจไม่สําเร็จ

การแก้ปัญหาบิลด์ที่ไม่เฉพาะตัว

เริ่มต้นจากการดำเนินการในเครื่อง ปัญหาที่ส่งผลกระทบต่อ Hit ของแคชในเครื่องจะแสดง การดำเนินการที่ไม่อยู่ภายใต้การควบคุม

  • ตรวจสอบว่าบิลด์ตามลำดับเป็นค่าว่าง: หากคุณเรียกใช้ make และบิลด์สำเร็จแล้ว การเรียกใช้บิลด์อีกครั้งไม่ควรสร้างเป้าหมายใดๆ ขึ้นมาใหม่ หากคุณเรียกใช้แต่ละบิลด์ สองครั้งหรือในหลายระบบ ให้เปรียบเทียบแฮชของเนื้อหาไฟล์และ ได้ผลลัพธ์ที่ต่างกัน บิลด์นี้ทำซ้ำไม่ได้
  • เรียกใช้ขั้นตอนเพื่อ แก้ไขข้อบกพร่อง Hit แคชในเครื่อง จากเครื่องไคลเอ็นต์มากมาย เพื่อให้แน่ใจว่าคุณสามารถตรวจจับ กรณีต่างๆ ในสภาพแวดล้อมของไคลเอ็นต์หลุดเข้ามาในการดำเนินการ
  • ดำเนินการบิลด์ภายในคอนเทนเนอร์ Docker ที่ไม่มีสิ่งใดนอกจาก ตรวจสอบโครงสร้างซอร์สและรายการเครื่องมือโฮสต์ที่ชัดเจน สร้างความเสียหายและ จะตรวจจับทรัพยากร Dependency ของระบบโดยปริยาย
  • ค้นหาและแก้ไขปัญหาความครบถ้วนสมบูรณ์โดยใช้ กฎการดำเนินการระยะไกล
  • เปิดใช้แซนด์บ็อกซ์ที่เข้มงวด ที่ระดับต่อการดำเนินการ เนื่องจากการดำเนินการในบิลด์อาจเป็นการเก็บสถานะและส่งผลต่อ บิลด์หรือเอาต์พุต
  • กฎพื้นที่ทำงาน อนุญาตให้นักพัฒนาซอฟต์แวร์เพิ่มทรัพยากร Dependency ไปยังพื้นที่ทำงานภายนอกได้ มีความสมบูรณ์เพียงพอที่จะทำให้เกิดกระบวนการที่กำหนดเองได้ คุณสามารถรับบันทึกการดำเนินการบางอย่างที่อาจไม่ปลอดภัยในกฎเวิร์กสเปซ Bazel ได้โดยเพิ่ม Flag --experimental_workspace_rules_log_file=PATH ลงในคำสั่ง Bazel

ความสุจริตกับบาเซล

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความสำเร็จของโครงการอื่นๆ จากการใช้เนื้อหาแบบแยกส่วน งานสร้างกับ Bazel ดูการบรรยายของ BazelCon: