การกำหนดเลขเวอร์ชั่นใน package.json

Programing May 18, 2019

เวลาที่เราติดตั้งโมดูลใหม่ด้วยคำสั่ง npm i --save มันก็จะไปทำการเขียนข้อมูลลงใน package.json ให้โดยมีชื่อโมดูลและเลขเวอร์ชั่นกำกับประมาณนี้

"dependencies": {
  "lodash": "^3.9.2"
}

เคยสงสัยไหมว่าไอ้ตัว ^ ภาษาอังกฤษเรียกว่า "caret" มันคืออะไรมีไว้ทำไม และเลขเวอร์ชั่นมันบอกอะไรเราได้บ้าง ซึ่งทั้งหมดนี้มันเป็นเรื่องของ Semantic Versioning

Semantic Versioning คืออะไร

มันเป็นมาตราฐานการตั้งชื่อเลขเวอร์ชั่นของแอพพลิเคชั่นต่างๆ ถ้าใครคิดจะทำแอพพลิเคชั่นอะไรก็ตาม ผมแนะนำให้ตั้งเลขเวอร์ชั่นตาม semantic version (หรือเรียกสั้นๆ ว่า semver) เพื่อให้เป็นมาตราฐานเดียวกัน

3 . 2 . 1
major minor patch

โดยจะใช้เพียงเลขแค่สามจุดในการตั้ง โดยมีหลักการตั้งตามนี้

  • Major จะเปลี่ยนเมื่อมี API ชุดใหม่ที่เข้าไม่ได้กับเวอร์ชั่นก่อนหน้า เช่น โค็ดมีการเขียนใหม่ให้ดีขึ้น หรือเปลี่ยน UI ใหม่หมด หรือเพิ่มฟีเจอร์ใหญ่ๆ เข้ามา
  • Minor จะเปลี่ยนเมื่อมีการเพิ่มฟีเจอร์ใหม่เข้ามา ถอดออก หรือปรับแต่งรูปแบบการทำงาน
  • Patch ก็คือการแก้ไขบั๊กเล็กๆ

การกำหนดเลขเวอร์ชั่นเพื่ออัพเดทโมดูล

ใน package.json เราสามารถกำหนดให้ทำการติดตั้งเวอร์ชั่นไหนของโมดูลนั้นๆ ได้ และสามารถกำหนดเป็นแบบช่วงของเลขเวอร์ชั่นได้ว่า เราอยากได้เฉพาะแค่ 1.x.x เท่านั้นนะ เป็นต้น

โดยเราจะใช้สัญลักษณ์สองแบบมาช่วยเขียนเลขเวอร์ชั่นลงไปคือ

Symbol Dependency Versions
caret (^) ^3.9.2 3.* . *
tilde (~) ~3.9.2 3.9.*

หากต้องการกำหนดเลขเวอร์ชั่นสำหรับโมดูลนั้นตอนติดตั้งให้ใช้คำสั่งแบบนี้

$ npm install "lodash@^4.0.0"
# หรือ
$ npm install "lodash@~4.0.0"

เพียงแค่นี้เมื่อติดตั้งมันจะทำการติดตั้งเวอร์ชั่นล่าสุดให้ โดยไม่เกินเลขที่เรากำหนดไว้ เช่น

  • ^4.0.0 มันจะติดตั้งคือ 4.1.0 หรือ 4.2.1 เป็นต้น
  • ~4.0.0 มันจะติดตั้งคือ 4.0.2 หรือ 4.0.11 เป็นต้น

สิ่งที่ควรทำในการติดตั้งโมดูล

จากประสบการณ์ของผม สมมติเราติดตั้งโมดูลโดยใช้คำส่ัง npm install lodash โดยค่าพื้นฐานของ npm มันจะทำการเขียน package.json ให้เป็นแบบ "lodash" : "^4.17.11" ทุกครั้ง ปัญหาที่ผมเจอก็คือในช่วงที่เราพัฒนาไป เราก็เขียนโค็ดให้ใช้ได้กับเวอร์ชั่น 4.17.11 แต่หลังจากหยุดพัฒนาโค็ดไปแล้วด้วยเหตุผลอะไรก็ตามนานหลายเดือน พอเรานำโปรเจ็คตัวนี้ไปติดตั้งใหม่ เมื่อเราสั่ง npm install อีกครั้งมันจะทำการติดตั้งเวอร์ชั่นล่าสุดมาให้ เช่น 4.30.1 สังเกตุว่าเลข Minor มันถูกอัพเดท ทำให้โค็ดเดิมที่เขียนอาจมีปัญหาและเกิดบั๊กได้ละ

คือมันจะมีบ้างโมดูลที่เมื่อเลข Minor เปลี่ยนเราก็ต้องเขียนโค็ดใหม่เลย ซึ่งเราจะรู้ได้ก็ต่อเมื่อเราเรียกใช้งานโมดูลนั้นๆ แล้ว ทำให้เราต้องมานั่งแก้ไขโค็ดกันใหม่ แทนที่มันจะสามารถนำไปใช้งานได้เลยทันที

วิธีแก้ไขของผมก็คือเวลาติดตั้งโมดูลผมจะกำหนดเลขเวอร์ชั่นโดยใช้ tilde (~) ทุกครั้ง เพราะเมื่อมีการ npm install ใหม่หรือ npm update มันจะอัพเดทเฉพาะ Patch ซึ่งแทบจะร้อยเปอร์เซ็นที่อัพเดท Patch แล้วโค็ดเดิมยังใช้ได้อยู่

อย่างที่กล่าวไปข้างต้นถ้าเราติดตั้งโมดูลไป npm จะทำการกำหนด caret (^) ใส่ในเลขเวอร์ชั่นทุกครั้งใน package.json ผมแนะนำว่าเราควรเปลี่ยนให้มันใช้ tilde (~) แทนโดยการ

$ npm config set save-prefix '~'

หากใครยังสงสัยเรื่องของสัญลักษณ์ ^ หรือ ~ ว่ามันจะไปเรียกเวอร์ชั่นอะไรมาของ npm สามารถไปลองเล่นได้ที่ https://semver.npmjs.com/ เพื่อทดสอบว่าถ้าเราใส่สัญลักษณ์อะไรไป มันจะไปเรียกเวอร์ชั่นอะไรมาบ้าง

อ้างอิง:
- https://semver.org/
- https://docs.npmjs.com/about-semantic-versioning

Arnon Kijlerdphon

IT manager & DevOps @Twin Synergy Co.,Ltd

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.