ทำไมจึงต้องใช้ระบบการสร้าง

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

ระบบบิลด์คืออะไร

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

ฉันจะใช้คอมไพเลอร์อย่างเดียวไม่ได้ใช่ไหม

ความจำเป็นในการใช้ระบบบิลด์อาจไม่ชัดเจนในทันที วิศวกรส่วนใหญ่ไม่ได้ใช้ระบบบิลด์ขณะเรียนรู้การเขียนโค้ด โดยส่วนใหญ่จะเริ่มด้วยการเรียกใช้เครื่องมือ เช่น gcc หรือ javac จากบรรทัดคำสั่งโดยตรง หรือเครื่องมือที่เทียบเท่าในสภาพแวดล้อมการพัฒนาแบบรวม (IDE) ตราบใดที่ซอร์สโค้ดทั้งหมดอยู่ในไดเรกทอรีเดียวกัน คำสั่งเช่นนี้ก็จะใช้งานได้

javac *.java

ซึ่งจะสั่งให้คอมไพเลอร์ Java นำไฟล์ซอร์สโค้ด Java ทั้งหมดในไดเรกทอรีปัจจุบันไปเปลี่ยนเป็นไฟล์คลาสไบนารี ในกรณีง่ายๆ เพียงเท่านี้คุณก็พร้อมใช้งาน

อย่างไรก็ตาม ปัญหาจะเริ่มเกิดขึ้นทันทีที่โค้ดขยาย javac ฉลาดพอที่จะมองหาโค้ดที่จะนําเข้าในไดเรกทอรีย่อยของไดเรกทอรีปัจจุบัน แต่ไม่มีวิธีค้นหาโค้ดที่เก็บไว้ในส่วนอื่นๆ ของระบบไฟล์ (อาจเป็นไลบรารีที่โปรเจ็กต์หลายรายการแชร์กัน) และรู้วิธีสร้างโค้ด Java เท่านั้น ระบบขนาดใหญ่มักประกอบด้วยส่วนต่างๆ ที่เขียนด้วยภาษาโปรแกรมต่างๆ ที่มีเครือข่ายของข้อกําหนดซึ่งกันและกัน ซึ่งหมายความว่าไม่มีคอมไพเลอร์สําหรับภาษาเดียวที่จะสร้างทั้งระบบได้

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

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

แล้วสคริปต์ของ Shell ล่ะ

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

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

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

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

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

  • แม้จะมีปัญหา แต่โปรเจ็กต์ของคุณก็ประสบความสำเร็จมากพอที่คุณจะเริ่มต้นจ้างวิศวกรเพิ่มได้ ตอนนี้คุณก็ตระหนักแล้วว่าไม่จําเป็นต้องเกิดเหตุการณ์ร้ายแรงขึ้นเพื่อให้เกิดปัญหาก่อนหน้านี้ คุณจะต้องทําตามกระบวนการเริ่มต้นใช้งานที่ยุ่งยากเหมือนเดิมทุกครั้งที่มีนักพัฒนาซอฟต์แวร์คนใหม่เข้าร่วมทีม และแม้จะพยายามอย่างเต็มที่แล้ว แต่ระบบของแต่ละคนก็ยังคงมีความแตกต่างเล็กน้อย บ่อยครั้งที่สิ่งที่ใช้งานได้บนเครื่องของคนหนึ่งใช้ไม่ได้กับเครื่องของอีกคนหนึ่ง และแต่ละครั้งต้องใช้เวลา 2-3 ชั่วโมงในการค้นหาเส้นทางเครื่องมือแก้ไขข้อบกพร่องหรือเวอร์ชันไลบรารีเพื่อหาความแตกต่าง

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

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

คุณพบปัญหาคลาสสิกเกี่ยวกับขนาด สําหรับนักพัฒนาซอฟต์แวร์คนเดียวที่ทํางานกับโค้ดไม่เกิน 200 บรรทัดเป็นเวลาไม่เกิน 1-2 สัปดาห์ (ซึ่งอาจเป็นประสบการณ์ทั้งหมดจนถึงตอนนี้ของนักพัฒนาซอฟต์แวร์ระดับเริ่มต้นที่เพิ่งจบมหาวิทยาลัย) คุณก็ใช้คอมไพเลอร์ได้ สคริปต์อาจช่วยคุณแก้ปัญหาได้ แต่ทันทีที่คุณต้องประสานงานกับนักพัฒนาซอฟต์แวร์หลายคนและเครื่องคอมพิวเตอร์ของนักพัฒนาซอฟต์แวร์เหล่านั้น แม้แต่สคริปต์การสร้างที่สมบูรณ์แบบก็ยังไม่เพียงพอ เนื่องจากการพิจารณาความแตกต่างเล็กน้อยในเครื่องเหล่านั้นเป็นเรื่องยากมาก เมื่อถึงจุดนี้ แนวทางง่ายๆ นี้ใช้ไม่ได้แล้ว และถึงเวลาลงทุนในระบบบิลด์จริง