หลังจากที่ทำการ review หลาย ๆ ระบบ พบปัญหาคล้าย ๆ กันคือ
ไม่ยอมระบุ version ของ library ที่ใช้งาน
หรือทำการระบุ version แบบเป็นช่วง

ปัญหาที่พบประกอบไปด้วย

  • ใช้ library version ไหนกันแน่
  • เมื่อ library ที่ใช้มีการ upgrade ก็พังกันหมด
  • build ผ่านบ้างไม่ผ่านบ้าง
  • test ผ่านบ้างไม่ผ่านบ้าง
  • เจอ bug แปลก ๆ อีก

สาเหตุหลัก ๆ มาจากคนใช้งาน หรือตัว package manager ที่ใช้งานกัน ?

เมื่อไปดู package manager ของภาษาต่าง ๆ พบว่า

มีความสามารถให้ระบุ version แบบ เป็นช่วงได้
เช่น มากกว่า หรือ น้อยกว่า
ที่น่ากลัวไปกว่านั้น คนใช้งานก็ดันใช้งานมันอีก
ผลที่เกิดขึ้นคือ พากันเข้าป่ากันใหญ่เลย !!

ตัวอย่างการใช้งานที่ผิด ๆ

ปล. Dependency Hell คือปัญหาใหญ่ของหลาย ๆ ภาษาโปรแกรมเลยนะ !!
ปล. บางตัวแนะนำให้ใช้ semantic versioning ก็ไม่ค่อยรอด !!
ปล. บางตัวไปดึง library มาจาก Version Control เช่น Git และ Bitbucket ก็ไม่รอดอีก เพราะว่าอ้างไปที่ HEAD หรือ branch !! (แนะนำให้ใช้ tag หรือ commit hash นะ)

ปัญหาต่าง ๆ เยอะมาก
ทั้งจากคนใช้งาน
ทั้งจาก package manager

ดังนั้น ถ้าต้องการแก้ไขหรือลดปัญหาลงไป ขอแนะนำดังนี้

  • ให้ระบุ version ของ library ที่ใช้ไปเลย
  • ให้ทำการ copy source code ของ library ใน version ที่ใช้งานลงมาที่ระบบเราด้วย เช่น go vendor เป็นต้น จากนั้นทำการจัดเก็บไว้ใน version control
  • ให้ทำการจัดเก็บไฟล์ binary ของ library ไว้ใน version control ด้วยเสมอ
  • ใช้ไฟล์version lock ด้วยเสมอ
    • Gemfile.lock สำหรับ bundlr
    • Shrinkwrap สำหรับ npm
    • Glock สำหรับ go

วิธีการต่าง ๆ เหล่านี้
จะช่วยเหลือให้การ update library ง่ายขึ้น
จะช่วยเหลือให้การ update library ปลอดภัยมากขึ้น
รวมทั้งทุกสิ่งอย่าง จะอยู่ภายใต้ version control

โดยสิ่งเหล่านี้เป็นพื้นฐานที่สำคัญของระบบ Continuous Integration และ Continuous Delivery ต่อไป
ถ้าพบว่า package manager มีปัญหาก็ให้ทำการแก้ไขเถอะนะ
เพราะว่า การพัฒนา software มันก็ยากอยู่แล้ว
อย่ามาทำส่วนอื่น ๆ ให้ยากตามไปอีกเลยนะ

ปล. หรือว่าปัจจุบันยังไม่รู้เลยว่าใช้ library อะไรและ version อะไรกันบ้าง ?

Reference Websites
https://dzone.com/articles/package-management-stop-using-version-ranges