หน้านี้กล่าวถึงความครบถ้วนสมบูรณ์ ประโยชน์ของการใช้งานสร้างที่แยกต่างหาก และ กลยุทธ์การระบุลักษณะการทำงานที่ไม่อิงตามองค์ประกอบในบิลด์ของคุณ
ภาพรวม
เมื่อได้รับซอร์สโค้ดป้อนเข้าและการกำหนดค่าผลิตภัณฑ์ที่เหมือนกัน ระบบบิลด์จะส่งคืนเอาต์พุตเดียวกันเสมอโดยการแยกบิลด์ออกจากการเปลี่ยนแปลง กับระบบโฮสต์
ในการแยกแยะบิลด์ บิลด์ที่รวมกันได้อย่างอิสระจึงไม่คำนึงถึงไลบรารีและ ซอฟต์แวร์อื่นที่ติดตั้งในเครื่องโฮสต์ภายในหรือระยะไกล ขึ้นอยู่กับ เวอร์ชันที่เจาะจงของเครื่องมือบิลด์ เช่น คอมไพเลอร์และทรัพยากร 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:
- การสร้างระบบเรียลไทม์ด้วย Bazel (SpaceX)
- Bazel Remote Execution และการแคชระยะไกล (Uber และ TwoSigma)
- สร้างได้เร็วขึ้นด้วยการดำเนินการและการแคชระยะไกล
- การผสม Bazel: งานสร้างที่เพิ่มขึ้นอย่างรวดเร็ว
- การดำเนินการระยะไกลกับการดำเนินการในเครื่อง
- การปรับปรุงความสามารถในการใช้งานของการแคชระยะไกล (IBM)
- การสร้างรถยนต์ขับรถด้วยตนเองด้วย Bazel (BMW)
- การสร้างรถยนต์ที่ขับเคลื่อนด้วยตนเองด้วย Bazel + ถามและตอบ (GM Cruise)