หลังจากที่ทำการ review หลาย ๆ ระบบ พบปัญหาคล้าย ๆ กันคือ
ไม่ยอมระบุ version ของ library ที่ใช้งาน
หรือทำการระบุ version แบบเป็นช่วง
ปัญหาที่พบประกอบไปด้วย
- ใช้ library version ไหนกันแน่
- เมื่อ library ที่ใช้มีการ upgrade ก็พังกันหมด
- build ผ่านบ้างไม่ผ่านบ้าง
- test ผ่านบ้างไม่ผ่านบ้าง
- เจอ bug แปลก ๆ อีก
สาเหตุหลัก ๆ มาจากคนใช้งาน หรือตัว package manager ที่ใช้งานกัน ?
เมื่อไปดู package manager ของภาษาต่าง ๆ พบว่า
มีความสามารถให้ระบุ version แบบ เป็นช่วงได้ เช่น มากกว่า หรือ น้อยกว่า ที่น่ากลัวไปกว่านั้น คนใช้งานก็ดันใช้งานมันอีก ผลที่เกิดขึ้นคือ พากันเข้าป่ากันใหญ่เลย !! ตัวอย่างการใช้งานที่ผิด ๆ [gist id="6d86832cfe7c6512d97b5824df0c12c3" file="problem.txt"] ปล. 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
ปล. หรือว่าปัจจุบันยังไม่รู้เลยว่าใช้ library อะไรและ version อะไรกันบ้าง ?Reference Websites https://dzone.com/articles/package-management-stop-using-version-ranges