สมุนไพร

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

ภาพรวม

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

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

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

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

ประโยชน์

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

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

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

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

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

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

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

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

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

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