๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Frontend/JavaScript

[ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(JavaScript) ] npm๊ณผ caret, tilde, ํŒจํ‚ค์ง€ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

by YWTechIT 2022. 5. 11.
728x90

๐Ÿ“ npm๊ณผ caret, tilde, ํŒจํ‚ค์ง€ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

npm์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ €๋‹ค. Node.js์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค์„ ํŒจํ‚ค์ง€ํ™”ํ•ด์„œ ๋ชจ์•„๋‘” ์ €์žฅ์†Œ ์—ญํ• ๊ณผ ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ CLI(Command line Interface)๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ž์‹ ์ด ์ž‘์„ฑํ•œ ํŒจํ‚ค์ง€๋ฅผ ๊ณต๊ฐœํ•  ์ˆ˜๋„ ์žˆ๊ณ , ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

๋‚ด๊ฐ€ ๋‹ค๋‹ˆ๋Š” ํšŒ์‚ฌ์—์„œ๋Š” npm ํŒจํ‚ค์ง€๋ฅผ ์ง์ ‘ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.(npm ํŒจํ‚ค์ง€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ) ์ทจ์—… ์ค€๋น„ํ•  ๋•Œ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•˜๋ฉด ํ•ญ์ƒ ํŒจํ‚ค์ง€ === ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์ง์ ‘ ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋‹ค ๋ณด๋‹ˆ ๊นŒ๋‹ค๋กœ์šด ๊ฒƒ์ด ํ•œ๋‘˜์ด ์•„๋‹ˆ์—ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒจํ‚ค์ง€ ๋ฒ„์ „์˜ ๊ธฐ๋ณธ์ ์ธ ๋‚ด์šฉ๋“ค์„ ํ˜„์—…์— ์ ์šฉํ•  ๋•Œ ๊นŒ๋จน์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๊ธ€์„ ๋‚จ๊ธด๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ์งˆ ๋•Œ package.json์— ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜๋Š”๋ฐ, ์ด๋•Œ ํŒจํ‚ค์ง€์—๋Š” ๋‹ค์Œ์ฒ˜๋Ÿผ ๋ฒ„์ „์ด ๋ช…์‹œ๋˜์–ด์žˆ๋‹ค.

// package.json
"typescript": "3.8.3"
"lint-staged": "^8.1.1",
"nodemon": "~1.19.1",

์˜ˆ๋ฅผ ๋“ค์–ด, typescript์˜ ๊ฒฝ์šฐ์—๋Š” 3.8.3์ด๋ผ๊ณ  ๋ช…์‹œ๋˜์–ด์žˆ๋Š”๋ฐ ์ด๋Ÿฌํ•œ ์ˆซ์ž๋ฅผ semantic versioning์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ๋ฒ„์ „์˜ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ(ไธป) ๋ฒ„์ „(Major), ๋ถ€(้ƒจ) ๋ฒ„์ „(Minor), ์ˆ˜(ไฟฎ) ๋ฒ„์ „(Patch)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. Major๋Š” ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๊ฒŒ API๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ณ€๊ฒฝ๋˜๊ณ , ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋Š” Minor๋ฅผ ์˜ฌ๋ฆฌ๊ณ , ๊ธฐ์กด ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋ฉด์„œ ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒƒ์ด๋ผ๋ฉด Patch๋ฅผ ์˜ฌ๋ฆฐ๋‹ค.

 

 

์ƒ๋‹จ codeBlock์— ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ๋ณด๋ฉด ๋‹จ์ˆœํžˆ ์ˆซ์ž๋งŒ ๋ถ™์—ฌ์žˆ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์ˆซ์ž ์•ž์— ^ ํ˜น์€ ~๊ฐ€ ๋ถ™์–ด์žˆ๋Š”๋ฐ, ^๋Š” caret(์บ๋Ÿฟ)์ด๋ผ ๋ถ€๋ฅด๊ณ , ๋ฌผ๊ฒฐํ‘œ์‹œ์ธ ~๋Š” tilde(ํ‹ธ๋“œ)๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. ์ด๋“ค์€ ๊ฐ๊ฐ ํŠน์ง•์ด ์žˆ๋Š”๋ฐ ^๋Š” Compatible with version์„ ๋œปํ•˜๋ฉฐ ๋‚˜์ค‘์— ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋”๋ผ๋„ major๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ตœ๋Œ€ ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด "lint-staged": "^8.1.1" ํŒจํ‚ค์ง€๋ฅผ ์—…๋ฐ์ดํŠธ ํ•˜๊ฒŒ๋˜๋ฉด major๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ตœ์‹  ๋ฒ„์ „์ธ 8.2.1์„ ๋‚ด๋ ค๋ฐ›๊ฒŒ ๋œ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ๊ฐ„๋‹จํ•œ ์‹คํ—˜์„ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, npm init -y๋กœ package.json์„ ๋งŒ๋“ค๊ณ  npm i lint-stages@8.1.1๋กœ 8.1.1๋ฒ„์ „์˜ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ๋‚˜์„œ npm i lint-stages๋ฅผ ์ง„ํ–‰ํ•˜๋‹ˆ 8.2.1๋ฒ„์ „์„ ๋ฐ›์•˜๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŒจํ‚ค์ง€๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๊ฒŒ ๋˜๋ฉด ^์€ ํ•ด๋‹น major๋ฅผ ์ œ์™ธํ•œ ๋ฒ„์ „์˜ ์ตœ์‹  ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š”๋‹ค๋Š” ์ ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ ~๋Š” tilde(ํ‹ธ๋“œ)๋Š” Approximately equivalent to version์„ ๋œปํ•˜๋ฉฐ, ํŒจํ‚ค์ง€ ๋ฒ„์ „ ์„ค์น˜ ๋ช…๋ น์–ด๋ฅผ ์–ด๋””๊นŒ์ง€ ์ž…๋ ฅํ–ˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด npm i nodemon@~1์ด๋ผ๊ณ  ์ž‘์„ฑํ•˜๋ฉด ๋ฒ„์ „์„ major๊นŒ์ง€๋งŒ ๋ช…์‹œํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— minor์™€ patch ๋ณ€๊ฒฝ์„ ํ—ˆ์šฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ํ•˜๋‹จ ์‚ฌ์ง„์ฒ˜๋Ÿผ major๋Š” 1์ด๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ตœ์‹ ๋ฒ„์ „์„ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค. ์ด๋Š” 1.x.x์™€ ๊ฐ™๋‹ค.

 

728x90

๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ npm i nodemon@~1.10์„ ๋‹ค์šด๋ฐ›์œผ๋ฉด patch๋ณ€๊ฒฝ์„ ํ—ˆ์šฉ ํ•  ๊ฒƒ์ด๊ณ , ์ด๋Š” 1.10.x์™€ ๊ฐ™๋‹ค.

 

์—ฌ๋‹ด์œผ๋กœ ^ ํ˜น์€ ~๋ฅผ ๋ถ™์ด์ง€ ์•Š๊ธฐ ์œ„ํ•ด npm install nodemon@1.10.1์„ ์ž…๋ ฅํ•˜๊ณ  package.json์„ ๋ณด๋ฉด ์ž๋™์œผ๋กœ caret์ด ๋ถ™์—ฌ์žˆ๋Š”๋ฐ, ์ด๋Š” npm save-prefix๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ^์œผ๋กœ ์„ค์ •๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋งŒ์•ฝ, default๊ฐ’์„ ^ ๋Œ€์‹  --save-exact๋‚˜ ~๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด npm config set save-prefix '--save-exact' ํ˜น์€ npm config set save-prefix '~'์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋œ๋‹ค. ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์€ npm config set ls -l ๋ช…๋ น์–ด์—์„œ save-prefix ํ‚ค ๊ฐ’์—์„œ๋„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ, npm config๋ฅผ ๊ฑด๋“ค์ง€์•Š๊ณ  ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด npm i --save-exact <package>@<version>์„ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

Reference

  1. https://poiemaweb.com/nodejs-npm
  2. https://docs.npmjs.com/about-semantic-versioning
  3. https://semver.org/lang/ko/
  4. https://stackoverflow.com/questions/22343224/whats-the-difference-between-tilde-and-caret-in-package-json
  5. https://bytearcher.com/goodies/semantic-versioning-cheatsheet/
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€