Cli: [๊ธฐ๋Šฅ] npm ci์—์„œ node_modules๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

์— ๋งŒ๋“  2019๋…„ 12์›” 06์ผ  ยท  53์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: npm/cli

๋ญ? ์™œ

๋นŒ๋“œ ์„œ๋ฒ„์—์„œ ์ฆ๋ถ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด npm ci --keep ์™€ ๊ฐ™์€ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ฐฐํฌ ์†๋„๊ฐ€ ํ›จ์”ฌ ๋นจ๋ผ์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. github ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์ด์ „ ์— ์ œ์•ˆ ๋œ ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค . ๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ๋Š” 10์›” 7์ผ ์— cli ํŒ€์—์„œ ๊ฒ€ํ†  ์ค‘์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ์ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? :-)

Enhancement

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์™„๋ฒฝํ•œ ์„ธ์ƒ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • npm install - ์˜ค๋Š˜๊ณผ ๊ฐ™์€ ๋™์ž‘
  • npm install --from-lockfile - ์ž ๊ธˆ ํŒŒ์ผ์—์„œ ์„ค์น˜( ci ์ฒ˜๋Ÿผ)
  • npm install --clean - npm install ์™€ ๋™์ผํ•œ ๋™์ž‘์ด์ง€๋งŒ node_modules ์ฝ˜ํ…์ธ  ์‚ญ์ œ
  • npm ci - npm install --from-lockfile --clean ๋Œ€ํ•œ ๋ณ„์นญ

๋ชจ๋“  53 ๋Œ“๊ธ€

์ด๊ฒƒ์€ ci / cleaninstall์ด ํ•˜๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ˜„์žฌ ๋™์ž‘์ด ์ •ํ™•ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒƒ์€ npm shrinkwrap ์ž…๋‹ˆ๋‹ค.

node_modules _folder_ ๋Š” ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  _contents_ ๋Š” ์‚ญ์ œํ•˜์ง€ ์•Š๋„๋ก ์—…๋ฐ์ดํŠธ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค(ํ•ด๋‹น ๊ฒŒ์‹œ๋ฌผ์—์„œ ์›๋ž˜ ์š”์ฒญํ•œ ๋Œ€๋กœ). npm ci ๋ช…๋ น์˜ ๋ชฉ์ ์€ ๊นจ๋—ํ•œ ์ƒํƒœ์—์„œ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด์ „ node_modules๋ฅผ ์œ ์ง€ํ•˜๋ ค๋ฉด npm i ํ•ฉ๋‹ˆ๋‹ค.

๋‹ต์žฅํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‹ต๋ณ€์ด ๋Šฆ์–ด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. npm shrinkwrap ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ์ง€์†์ ์ธ ํ†ตํ•ฉ์„ ์œ„ํ•ด ๋นŒ๋“œ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๊นŒ? ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด ๋‚ด package-lock.json ์ด npm-shrinkwrap.json ๋˜์ง€๋งŒ CI ์ค‘์— ๋ฌด์—‡์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? npm install ์ฆ๋ถ„ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋˜๋Š” npm ci ์‹คํ–‰ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋ชจ๋“  ํŒจํ‚ค์ง€๊ฐ€ ๋‹ค์‹œ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. -(๋‚ด๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ์ฆ๋ถ„ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ package-lock.json ์žˆ๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น์ž…๋‹ˆ๋‹ค.

@claudahdz; ๋‚ด ์ดํ•ด๋Š” CI ์ค‘์— npm install ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด package-lock.json ์ด ์—…๋ฐ์ดํŠธ๋˜๊ณ  ๋ช‡ ์ฃผ ํ›„์— ๋™์ผํ•œ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๊ฐ€ ์„ค์น˜๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๋ง์ธ๊ฐ€์š”?

Ps npm ci ๋Š” Continuous Integration์˜ ์•ฝ์ž๋ผ๊ณ  ์ƒ๊ฐ

์—ฌ๊ธฐ ์ฐธ์กฐ: https://github.com/npm/npm/issues/20104#issuecomment -403321557

ํ˜„์žฌ ๋™์ž‘์€ Docker ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ npm ci ์žˆ๊ณ (์ง€์†์  ํ†ตํ•ฉ์— ๋งค์šฐ ์ผ๋ฐ˜์ ์ž„) node_modules ์— ๋ฐ”์ธ๋“œ ๋งˆ์šดํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

webpack_1   | npm ERR! path /var/www/project/docker-config/webpack-dev-devmode/node_modules
webpack_1   | npm ERR! code EBUSY
webpack_1   | npm ERR! errno -16
webpack_1   | npm ERR! syscall rmdir
webpack_1   | npm ERR! EBUSY: resource busy or locked, rmdir '/var/www/project/docker-config/webpack-dev-devmode/node_modules'

๊ทธ๋Ÿฌ๋ฉด Docker ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

--no-delete ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ npm ci ๊ฐ€ node_modules ์˜ _contents_๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋””๋ ‰ํ† ๋ฆฌ ์ž์ฒด๋Š” ์‚ญ์ œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

ci = ์ƒˆ๋กœ ์„ค์น˜

์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ž ๊ธˆ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์ผ๋ฐ˜ npm i ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

--no-delete ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ๊ฑฐ๋‚˜ npm ci๊ฐ€ node_modules์˜ ๋‚ด์šฉ์„ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋””๋ ‰ํ† ๋ฆฌ ์ž์ฒด๋Š” ์‚ญ์ œํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข‹์Šต๋‹ˆ๋‹ค.

rm -rf node_modules/* && npm i

ci = ์ƒˆ๋กœ ์„ค์น˜

์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ž ๊ธˆ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์ผ๋ฐ˜ npm i๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

...๋•Œ๋ฌธ์—: https://docs.npmjs.com/cli/ci.html

์ด ๋ช…๋ น์€ ํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ, ์ง€์†์  ํ†ตํ•ฉ ๋ฐ ๋ฐฐํฌ์™€ ๊ฐ™์€ ์ž๋™ํ™”๋œ ํ™˜๊ฒฝ ๋˜๋Š” ์ข…์†์„ฑ์„ ์ƒˆ๋กœ ์„ค์น˜ํ•˜๋ ค๋Š” ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ  npm-install๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ์ž ์ง€ํ–ฅ ๊ธฐ๋Šฅ ์„ ํ›จ์”ฌ ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๋˜ํ•œ ์ผ๋ฐ˜ ์„ค์น˜๋ณด๋‹ค ๋” ์—„๊ฒฉํ•˜๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ npm ์‚ฌ์šฉ์ž๊ฐ€ ์ ์ง„์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋‚˜ ๋ถˆ์ผ์น˜๋ฅผ

๋” ๋น ๋ฅธ ์„ค์น˜์™€ ๊นจ๋—ํ•œ ์Šฌ๋ ˆ์ดํŠธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๊ฐ™์€ CI ํ™˜๊ฒฝ์— ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

rm -rf node_modules/* && npm i

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ง€๊ธˆํ•˜๋Š” ์ผ์ด์ง€๋งŒ npm ci ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์š•๊ตฌ๋Š” ์œ„๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

npm ci ๊ฐ€ ๋””๋ ‰ํ† ๋ฆฌ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ node_modules ์˜ ๋‚ด์šฉ ์„ ์ œ๊ฑฐํ•˜๋„๋ก ํ•˜๋Š” ๊ตฌ์„ฑ ํ”Œ๋ž˜๊ทธ๋ฅผ ์š”์ฒญํ•˜๋Š” RFC๋ฅผ ์ œ์ถœํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋ฌด์‹œํ•˜๋„๋ก Dropbox๋ฅผ ์„ค์ •ํ–ˆ๋‹ค๋Š” ์ ์—์„œ ์ €์—๊ฒŒ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ญ์ œํ•˜๋ฉด ํ•ด๋‹น ์„ ํƒ์  ์„ค์ •์ด ์‚ฌ๋ผ์ง€๊ณ  ๋‹ค์Œ์— node_modules ์ƒ์„ฑ๋˜๋ฉด ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

npm ci ๊ฐ€ ๋””๋ ‰ํ† ๋ฆฌ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ node_modules ์˜ _contents_๋ฅผ ์ œ๊ฑฐํ•˜๋„๋ก ํ•˜๋Š” ๊ตฌ์„ฑ ํ”Œ๋ž˜๊ทธ๋ฅผ ์š”์ฒญํ•˜๋Š” RFC๋ฅผ ์ œ์ถœํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์„ ํƒ์ ์œผ๋กœ ๋ฌด์‹œํ•˜๋„๋ก Dropbox๋ฅผ ์„ค์ •ํ–ˆ๋‹ค๋Š” ์ ์—์„œ ์ €์—๊ฒŒ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ญ์ œํ•˜๋ฉด ํ•ด๋‹น ์„ ํƒ์  ์„ค์ •์ด ์‚ฌ๋ผ์ง€๊ณ  ๋‹ค์Œ์— node_modules ์ƒ์„ฑ๋˜๋ฉด ๋™๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋˜ํ•œ npm์ด dir(OSX ์ŠคํฌํŠธ๋ผ์ดํŠธ ๋ฐ ๊ธฐํƒ€์˜ ๊ฒฝ์šฐ)์„ ๋ฌด์‹œํ•˜๋„๋ก ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์„ค๋ช…๋œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๊นŒ? ์ด ๊ธฐ๋Šฅ์„ ํ•„์š”๋กœ ํ•˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋„ ์žˆ์—ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ci = ์ƒˆ๋กœ ์„ค์น˜

์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ž ๊ธˆ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์ผ๋ฐ˜ npm i ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

npm i ๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ์ž ๊ธˆ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. npm i ์ค‘์— package-lock.json์ด ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋ฐœ์ƒํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ๋œ ๋ฐ”์™€ ๊ฐ™์ด npm i ๋Š” package-lock.json์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ์ด์ƒ์ ์ธ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊นƒ๋ฐœ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ๋œ ๋ฐ”์™€ ๊ฐ™์ด npm i ๋Š” package-lock.json์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ์ด์ƒ์ ์ธ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด npm i ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋‚ด ์˜๋ฏธ์—์„œ ci = clean install ์— ๋Œ€ํ•ด ๊ทธ๋‹ค์ง€ ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

"์ƒˆ๋กœ ์„ค์น˜"์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ์ƒ์œ„ node_modules/ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ(์‹ค์ œ ๋‚ด์šฉ์„ ์ƒˆ๋กœ ์„ค์น˜ํ•˜๋Š” ๋™์•ˆ)?

์ด ๊ฒฝ์šฐ CI๊ฐ€ ์ง€์†์ ์ธ ํ†ตํ•ฉ์„ ์˜๋ฏธํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฌธ์„œ์—์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ƒˆ๋กœ ์„ค์น˜๋Š” ์ง€์†์  ํ†ตํ•ฉ ํ™˜๊ฒฝ์—์„œ ์ข…์ข… ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ช…๋ น์€ ํ…Œ์ŠคํŠธ ํ”Œ๋žซํผ, ์ง€์†์  ํ†ตํ•ฉ ๋ฐ ๋ฐฐํฌ์™€ ๊ฐ™์€ ์ž๋™ํ™”๋œ ํ™˜๊ฒฝ ๋˜๋Š” ์ข…์†์„ฑ์„ ์ƒˆ๋กœ ์„ค์น˜ํ•˜๋ ค๋Š” ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๋ฉด npm-install๊ณผ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํŠน์ • ์‚ฌ์šฉ์ž ์ง€ํ–ฅ ๊ธฐ๋Šฅ์„ ๊ฑด๋„ˆ๋›ฐ๋ฉด ์ผ๋ฐ˜ npm ์„ค์น˜๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ฐ˜ ์„ค์น˜๋ณด๋‹ค ๋” ์—„๊ฒฉํ•˜๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ npm ์‚ฌ์šฉ์ž๊ฐ€ ์ ์ง„์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋‚˜ ๋ถˆ์ผ์น˜๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm ci ๋Š” ํŠนํžˆ ์ž๋™ํ™”๋œ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์œผ๋กœ, ์—ฌ๋Ÿฌ ๋ฒˆ ์ด๋Š” Docker ๊ธฐ๋ฐ˜ ์„ค์ •์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

node_module/ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋™์ž‘์€ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋กœ Docker ๊ธฐ๋ฐ˜ ์„ค์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ด ๋ช…๋ น์„ ์˜๋„๋œ ๋ชฉ์ ๊ณผ ํ™˜๊ฒฝ์— ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์„ ์š”์ฒญํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ช…์‹œ๋œ ๋ฐ”์™€ ๊ฐ™์ด npm i ๋Š” package-lock.json์„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋ž˜๊ทธ๋Š” ์ด์ƒ์ ์ธ ์†”๋ฃจ์…˜์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด npm i ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๊นŒ? ์ด๊ฒƒ์€ ๋‚ด ์˜๋ฏธ์—์„œ ci = clean install ์— ๋Œ€ํ•ด ๊ทธ๋‹ค์ง€ ์˜๋ฏธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ์งˆ๋ฌธ์„ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. npm install ์™€ npm ci ์‚ฌ์ด์˜ ๋‹ค๋ฅธ ์ฐจ์ด์ ์ด ์žˆ๋‹ค๋ฉด npm install ์—์„œ ๋‘ ์˜ต์…˜์„ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ci ํ•„์š” npm install --no-update-package-lock --clean-node-modules ์™€ ๊ฐ™์€ ๋ณ„์นญ์ด ๋ฉ๋‹ˆ๋‹ค.

node_module/ ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๋™์ž‘์€ ์ด ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋กœ Docker ๊ธฐ๋ฐ˜ ์„ค์ •์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์— ์ด๊ฒƒ์€ ์ด๋ฏธ์ง€๊ฐ€ ๋นŒ๋“œ๋  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ๋ฐœ์ƒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„์—๋Š” ๊ฐœ๋ฐœ ์ค‘์— npm i ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ci ๋Š” npm install --no-update-package-lock --clean-node-modules ์™€ ๊ฐ™์€ ๋ณ„์นญ์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ์ผ๋ฐ˜ npm i ๋ช…๋ น์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ํ”Œ๋ž˜๊ทธ๊ฐ€ ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฌด๊ด€์‹ฌํ•˜๊ณ  ์†”์งํžˆ ci ์—ฌ์•ผํ•œ๋‹ค๋Š” ๊ตฌ์ฒด์ ์ธ ์ฃผ์žฅ์„ํ•˜๊ธฐ์—๋Š” js ํ† ์ง€๊ฐ€์žˆ๋Š” n00b๊ฐ€ ๋„ˆ๋ฌด ๋งŽ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์•„๋Š” ๊ฒƒ์€ package-lock.json ์—…๋ฐ์ดํŠธํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. node_modules ์ œ๊ฑฐํ•˜๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

npm ci ๋Š” ์ž ๊ธˆ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ  ์ž ๊ธˆ ํŒŒ์ผ์—์„œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ „์— ์ด ์‚ฌ๋žŒ๋“ค์ด rm -rf node_modules ๋Œ€ํ•ด ์กฐ์–ธ์„ ๋ฐ›๊ณ  npm i ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  faik ์‚ฌ๋žŒ๋“ค์€ ์ž ๊ธˆ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ž ๊ธˆ ํŒŒ์ผ์—์„œ ์„ค์น˜ํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ npm ci ๊ฐ€ ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก๊ณผ ํŠธ๋ฆฌ ๋ฐ ๊ธฐํƒ€ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable ์ฐธ์กฐ

ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค npm i ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์—๋ฎฌ๋ ˆ์ดํŠธ ํ•  ์ˆ˜์žˆ๋Š”์„ npm ci ์— ๋Œ€ํ•œ ํ”Œ๋ž˜๊ทธ๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๊ณ  ๋” ๋‚˜์€ ์†”๋ฃจ์…˜ ์ธ npm ci ์—ฌ์ „ํžˆ ํฌํ•จํ•ด์•ผํ•œ๋‹ค ํ˜„์žฌ ์‚ฌ์šฉ ์‚ฌ๋ก€ imho. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ yarn install --frozen-lockfile ๋˜๋Š” yarn --frozen-lockfile ์™€ ์•ฝ๊ฐ„ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ npm ci , npm i ๋“ฑ์œผ๋กœ ๋ถ„์‚ฐ๋˜์–ด ์ข€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค(๋ฌธ์„œ, ์ฝ”๋“œ, ...). ์ ์–ด๋„ ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. npm i ๋„ฃ์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋” ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋™์ž‘์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ ํ˜„์žฌ ์‚ฌ์šฉ ์‚ฌ๋ก€ imho๋งŒ ํฌํ•จํ•ด์•ผ ํ•˜๋Š” npm ci์— ๋Œ€ํ•œ ํ”Œ๋ž˜๊ทธ๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๊ณ  ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์ธ npm ci๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ๋Š” npm i์— ์ƒˆ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ yarn install --frozen-lockfile ๋˜๋Š” yarn --frozen-lockfile ๊ณผ ์•ฝ๊ฐ„ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

npm i ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋ฉด ๋งค์šฐ ๊ธฐ์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์›๋ณธ ๊ฒŒ์‹œ๋ฌผ์„ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋‚˜์š”?

npm ci ๋Š” ์ž ๊ธˆ ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ  ์ž ๊ธˆ ํŒŒ์ผ์—์„œ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ด์ „์— ์ด ์‚ฌ๋žŒ๋“ค์ด rm -rf node_modules ๋Œ€ํ•ด ์กฐ์–ธ์„ ๋ฐ›๊ณ  npm i ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ ์„ค์น˜ํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  faik ์‚ฌ๋žŒ๋“ค์€ ์ž ๊ธˆ ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  ์ž ๊ธˆ ํŒŒ์ผ์—์„œ ์„ค์น˜ํ•˜๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ npm ci ๊ฐ€ ํƒ„์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์„ค์น˜๋œ ํŒจํ‚ค์ง€ ๋ชฉ๋ก๊ณผ ํŠธ๋ฆฌ ๋ฐ ๊ธฐํƒ€ ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.

https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable ์ฐธ์กฐ

ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋“ค์–ด ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค npm i ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ ์—๋ฎฌ๋ ˆ์ดํŠธ ํ•  ์ˆ˜์žˆ๋Š”์„ npm ci ์— ๋Œ€ํ•œ ํ”Œ๋ž˜๊ทธ๋ณด๋‹ค ๋” ์œ ์—ฐํ•˜๊ณ  ๋” ๋‚˜์€ ์†”๋ฃจ์…˜ ์ธ npm ci ์—ฌ์ „ํžˆ ํฌํ•จํ•ด์•ผํ•œ๋‹ค ํ˜„์žฌ ์‚ฌ์šฉ ์‚ฌ๋ก€ imho. ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์€ yarn install --frozen-lockfile ๋˜๋Š” yarn --frozen-lockfile ์™€ ์•ฝ๊ฐ„ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

rm -rf node_modules/* "์ฒญ์†Œ"์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์—์„œ ๋ฌป๋Š” ๊ธฐ๋Šฅ์€ npm ci์— ์žˆ๋Š” ๊ธฐ๋Šฅ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” npm ci์˜ ์ „์ฒด ๋™์ž‘์„ npm i๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹  rm -rf node_modules ๋Œ€์‹  rm -rf node_modules/* ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก npm ci์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค.

BTW ์ด ๋ฌธ์ œ๋Š” ๋” ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›์•„์•ผ ํ•˜๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ์ž๋Š” ์ด์— ๋Œ€ํ•œ ์˜๊ฒฌ๊ณผ ๊ณ„ํš์„ ๋ฐœํ‘œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. docker ์‚ฌ์šฉ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ npm ci์˜ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€ ์ค‘ ํ•˜๋‚˜์ธ CI(์ง€์†์  ํ†ตํ•ฉ)์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ญ์ƒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค!

์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ RFC๋ฅผ ์—ฌ์‹ญ์‹œ์˜ค.

ํ˜ผ๋™์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฌธ์ œ์˜ ์ด๋ฆ„์„ "npm CI์—์„œ node_modules dir์„ ์ œ๊ฑฐํ•˜๋Š” ๋Œ€์‹  ๋น„์–ด ์žˆ์Œ"์œผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์˜ ์˜๋„๋Š” node_modules ํด๋”๋ฅผ ์‚ญ์ œํ•˜๊ฑฐ๋‚˜ ํด๋”์˜ ๋‚ด์šฉ๋งŒ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•ญ์ƒ node_modules ์˜ ๋‚ด์šฉ์„ ๋ณด์กดํ•˜์ง€๋งŒ ์ตœ์‹  ์ƒํƒœ์ด๊ณ  package-lock.json ์™€ ๋™๊ธฐํ™”๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋”ฐ๋ผ์„œ package-lock.json ๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ์ฆ๋ถ„ ์—…๋ฐ์ดํŠธ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ํ‹€๋ ธ์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์—ฌ๊ธฐ์— ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ํด๋”๋ฅผ ์™„์ „ํžˆ ์‚ญ์ œํ•˜๋Š” ๋Œ€์‹  node_modules์˜ ๋‚ด์šฉ๋งŒ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ฌธ์ œ ๋˜๋Š” RFC๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์น˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@Zenuka npm CI๊ฐ€ ๋น ๋ฅด๊ณ  ์กด์žฌํ•˜๋Š” ์ „์ฒด ์ด์œ ๋Š” ๊ธฐ์กด node_modules ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ๋ฌด์‹œํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋ฏ€๋กœ ๋ณ€๊ฒฝ๋  ๊ฐ€๋Šฅ์„ฑ์€ ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” nodes_modules ํด๋”๊ฐ€ ์ตœ์‹ ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒฝ์šฐ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•˜๋Š” ํŒจํ‚ค์ง€๋งŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค(์˜ˆ npm i ). ์ผ๋ถ€ ์ „์šฉ VM์ด ๋นŒ๋“œ ์—์ด์ „ํŠธ๋กœ ์‹คํ–‰ ์ค‘์ด๋ฏ€๋กœ ๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  nodes_modules ํด๋”์™€ ๋ชจ๋“  ๋‚ด์šฉ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋น ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. package.json ๋˜๋Š” package-lock.json ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ฝ”๋“œ ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” nodes_modules ํด๋”๊ฐ€ ์ตœ์‹ ์ธ์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅผ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„, ์ด๊ฒƒ์€ (ํŒจํ‚ค์ง€ ํŠธ๋ฆฌ์˜ ๊ณ„์‚ฐ) ๊ฐ€์žฅ ์‹œ๊ฐ„์ด ๋งŽ์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒ€์‚ฌ๋Š” npm ci ์ •๋ง ๋Š๋ฆฌ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋นŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  nodes_modules ํด๋”์™€ ๋ชจ๋“  ๋‚ด์šฉ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ชจ๋“  ๊ฒƒ์„ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์‹œ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋นจ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์œ ๋Š” ์•„๋งˆํ•˜์ง€, ๊ทธ๊ฑด npm ci ๋ฌด์—‡์„ํ•˜๋Š” ๊ฑด๋„ˆ ๋œ€ ์†Œ๊ฐœ ๋œ npm i (ํŒจํ‚ค์ง€ ํŠธ๋ฆฌ ํ™•์ธ) ์•Š์Šต๋‹ˆ๋‹ค๋ฅผ.

@Zenuka npm install ์ด๋ฏธ ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. npm ci ์—๋Š” ๋‹จ ํ•˜๋‚˜์˜ ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, diff๋ฅผ ๊ณ„์‚ฐํ•  ํ•„์š”๊ฐ€ ์—†๋„๋ก node_modules๋ฅผ ์‚ญ์ œํ•˜์—ฌ ๋” ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜์‹ญ์‹œ์˜ค.

์•„๋งˆ๋„ ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ npm i๊ฐ€ ํ•˜๋Š” ์ผ์„ ๊ฑด๋„ˆ๋›ฐ๋Š” npm ci๊ฐ€ ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค(ํŒจํ‚ค์ง€ ํŠธ๋ฆฌ ํ™•์ธ).

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋‚ด ์ปดํ“จํ„ฐ ์—์„œ๋งŒ ํ…Œ์ŠคํŠธํ–ˆ์ง€๋งŒ(๋ฌผ๋ก  ์ข‹์€ ์ธก์ •์€ ์•„๋‹˜) ์ตœ์‹  node_modules ํด๋”์—์„œ npm install ์‹คํ–‰์€ 10์ดˆ ์ด๋‚ด์— ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค. npm ci ๋ฐ ๋ช‡ ๋ถ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋Œ€ํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” npm install ์ž ๊ธˆ ํŒŒ์ผ์„ ๊ณ ์ •ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ ํ•˜๋ผ๋Š” ๋‹น์‹ ์˜

package-lock.json ์ด ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ Windows์—์„œ๋„ ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค. https://github.com/fuzzykiller/verify-node-modules๋ฅผ ์ฐธ์กฐ

node_modules ์— ๋‹ค๋ฅธ ๊ฒƒ์ด ์—†๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์กฐ๊ธˆ ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ์ง€๋งŒ ์—ฌ์ „ํžˆ 1์ดˆ ๋ฏธ๋งŒ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ npm ci ์˜ ์ฆ๋ถ„ ๋ฒ„์ „์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠธ๋ฆฌ๋Š” ์ด๋ฏธ ๊ณ„์‚ฐ๋˜์–ด package-lock.json ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ๊ธฐ๋ณธ์ ์œผ๋กœ ์œ ์ผํ•œ ์ด์œ ๋Š” npm ci ์กด์žฌ๋Š”์— ๋ฌด์—‡์ด ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค package-lock.json . npm install ์ฒ˜๋Ÿผ ๊นœ์ง ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ๋ชฐ๋ž˜ ํ•˜์ง€ ์•Š๊ณ  ๋ง์ด์ฃ .

๋‚ด 2์„ผํŠธ, ๋‚˜๋Š” ๊ฐœ์ธ์ ์œผ๋กœ ์šฐ๋ฆฌ ์ธํ”„๋ผ๋ฅผ npm ci ๋กœ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ์ด์ „ ํƒœ๊ทธ npm i ๊ฐ€ ์ž ๊ธˆ ํŒŒ์ผ์„ ์ค€์ˆ˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๋„ ์ง€๊ฒน๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์ œ์˜ ํฐ๊ฐ€์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ npm ci ์ˆ˜์ค€ (.. ๋‚ด๊ฐ€ ์–ป์„ ์ˆ˜์žˆ๋Š” ๊ทธ clean install ์˜ ๊ทธ๊ฒƒ์—๊ฒŒ ์ผ์„)๋ฅผ npm i REALLLLLYLYY์ด ํ”Œ๋ž˜๊ทธ๋ฅผ ํ•„์š”๋กœํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•œ ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๊ณ  npm ํŒ€์ด ์‚ฌ๋žŒ๋“ค์ด npm ci ์‚ฌ์šฉํ•˜๋„๋ก ์ œ์•ˆํ•œ 2๋…„ ์ด์ƒ๋œ(๊ทธ๋ฆฌ๊ณ  ์—ฌ์ „ํžˆ ์—ด๋ ค ์žˆ๋Š”) npm i ์— ๋Œ€ํ•œ ๋ฌธ์ œ ์Šค๋ ˆ๋“œ๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. lol... this ์‚ฌ๋žŒ๋“ค์ด ๊ณผ๊ฑฐ์— npm์„ ํฌ๊ธฐํ•˜๊ณ  ์›์‚ฌ๋กœ ๊ฐ„ ์ด์œ ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋˜ ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž ๊ด€์ 

๋‚˜๋Š” ๋ชจ๋“ˆ์„ ์œ ์ง€ํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ํˆฌํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค :heavy_plus_sign: .

+1 - @phyzical ๊ณผ @fuzzykiller๊ฐ€ ๋งํ–ˆ๋“ฏ์ด npm install ์™€ npm ci ์‚ฌ์ด์—๋Š” node_modules๋ฅผ ์œ ์ง€ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ package-lock.json ์กด์ค‘ํ•˜๊ณ  ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰๋˜๋Š” "์Šค์œ„ํŠธ ์ŠคํŒŸ"์ด ์—†์Šต๋‹ˆ๋‹ค.
๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค - node_modules์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” package-lock์˜ ์ข…์†์„ฑ์„ ์ฐพ์€ ๋‹ค์Œ ๋ˆ„๋ฝ๋œ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์„ ์„ค์น˜ํ•˜์‹ญ์‹œ์˜ค. ์—…๊ทธ๋ ˆ์ด๋“œ๋‚˜ ์‚ญ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋Š ์ชฝ์ด ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค ( install ๋˜๋Š” ci )์ด์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค,ํ•˜์ง€๋งŒ ๊ฐ™์€์ด ์†Œ๋ฆฌ์˜ ๋ชจ๋“  npm install ๋‹จ์ง€ ๋ชจ๋“ ๊ณผ์— ๋Œ€ํ•œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์–ด์•ผ npm ci ๋Š” ๋ณ„๋„์˜ ๋ช…๋ น์–ด๊ฐ€ ์•„๋‹ˆ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค.

npm ci ๊ฐ€ ์›๋ž˜ ์ด ๋ฌธ์ œ๊ฐ€ ์ œ๊ธฐํ•˜๋Š” ๋™์ผํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜ ์œผ๋กœ ์„ ์ „๋˜์—ˆ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๋Š” ๋‹ค์†Œ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์‚ฌ๋žŒ๋“ค์˜ ์ˆซ์ž๊ฐ€ ์›ํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ์›๋ž˜ ํ–‰๋™ npm install ์ƒ๊ธฐ๋ณด๊ณ ํ–ˆ๋‹ค package-lock.json ๋Œ€์‹  package.json . ์šฐ๋ฆฌ๋Š” npm install ์— ํ”Œ๋ž˜๊ทธ๋ฅผ ์ง€์ •ํ•˜์—ฌ ํ•ด๋‹น ๋™์ž‘์„ ์ผœ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์–ป์€ ๊ฒƒ์€ npm ci . ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

package.json์€ ํ”„๋กœ์ ํŠธ์˜ ํ•„์ˆ˜ ์ข…์†์„ฑ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ž ๊ธˆ ํŒŒ์ผ์ด ์ด๋ฅผ ์ถฉ์กฑํ•  ์ˆ˜ ์—†์œผ๋ฉด ์ž ๊ธˆ ํŒŒ์ผ์ด ์–‘๋ณดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. lockfile์˜ ๋ชฉ์ ์€ package.json์„ ํ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์—์„œ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ์„ค์น˜๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์•Œ์•˜์–ด. npm install ๋Š” ํ•ด๋‹น ์˜ต์…˜์— ์ ํ•ฉํ•œ ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ผ npm ci ์ž…๋‹ˆ๋‹ค. npm ci ์ œ์™ธํ•˜๊ณ ๋Š” ์›๋ž˜ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์œ ์šฉํ•œ ์†”๋ฃจ์…˜์ด ๋˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ์ถ”๊ฐ€ ๋™์ž‘( node_modules ํด๋” ์ง€์šฐ๊ธฐ)์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ง€๊ธˆ npm ci ์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์—†๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ci = ์ƒˆ๋กœ ์„ค์น˜

์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค. ์ž ๊ธˆ ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์ผ๋ฐ˜ npm i๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์–ด๋Š... ์ข‹์•„. ํ”Œ๋ž˜๊ทธ๊ฐ€ ์–ด๋””์— ์ถ”๊ฐ€๋˜๋Š”์ง€๋Š” ๋ณ„๋กœ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฉด์˜ ๊ธฐ๋ณธ ์ฒ ํ•™์— ๋Œ€ํ•ด ์ดํ•ด๊ด€๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ด๋”˜๊ฐ€์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์  ์žฅ, ์‚ฌ๋žŒ๋“ค์ด ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋œ ์ œ3์˜ ๋ช…๋ น์„ ์›ํ•œ๋‹ค ํ•ด๋„ ๋‚˜๋Š” ์ด์˜๋ฅผ ์ œ๊ธฐํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๋‚ด๊ฐ€ ์‹ ๊ฒฝ์“ฐ๋Š” ์œ ์ผํ•œ ๊ฒƒ์€ ์ผ๋ฐ˜ ์„ค์น˜๋ฅผ ์œ„ํ•œ package-lock.json ์กด์ค‘์— ๋Œ€ํ•œ ์ด ๋Œ€ํ™”๊ฐ€ ์‹œ์ž‘๋œ ์ง€ 3๋…„์ด ์ง€๋‚ฌ์ง€๋งŒ ์—ฌ์ „ํžˆ ์šฐ๋ฆฌ๊ฐ€ ์›๋ž˜ ์š”์ฒญํ–ˆ๋˜ ๋™์ž‘์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด ์ง์žฅ์—์„œ ์šฐ๋ฆฌ๋Š” ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋งˆ์ด๋„ˆ ๋ฐ bugfix ๋ฒ„์ „ ์—…๋ฐ์ดํŠธ์—์„œ ๋ฒ„๊ทธ๋ฅผ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์˜๋„์ ์ธ ํŒจํ‚ค์ง€ ์—…๊ทธ๋ ˆ์ด๋“œ ์ค‘์—๋งŒ ์ด๋Ÿฌํ•œ ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ณ ์ž ํ•˜๋ฉฐ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ๊ณผ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ผ๊ด€์„ฑ์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์‚ฌ๋žŒ์€ ์ „ํ™”๋ฅผํ•˜๊ณ  ์‹ถ์–ดํ•˜๊ฑฐ๋‚˜ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋„ฃ์–ด ์›ํ•˜๋Š” ์–ด๋””๋“ ์ง€, ์šฐ๋ฆฌ๋Š” ๋˜ํ•œ์„ ํ†ตํ•ด ์•‰์•„ ์šฐ๋ฆฌ๋ฅผ ํ•„์š”๋กœํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ์ž ๊ธˆ ํŒŒ์ผ์—์„œ ํŒจํ‚ค์ง€๋ฅผ ์–ป์„ ์ˆ˜์žˆ๋Š” ๋น ๋ฅธ ๋ฐฉ๋ฒ• ์›ํ•˜๋Š” node-gyp ์ด๋ฏธ ์„ค์น˜๋œ ๋ชจ๋“ˆ๋งˆ๋‹ค ์šฐ๋ฆฌ์— ๋Œ€ํ•œ ๋นŒ๋“œ๋ฅผ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์™„๋ฒฝํ•œ ์„ธ์ƒ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

  • npm install - ์˜ค๋Š˜๊ณผ ๊ฐ™์€ ๋™์ž‘
  • npm install --from-lockfile - ์ž ๊ธˆ ํŒŒ์ผ์—์„œ ์„ค์น˜( ci ์ฒ˜๋Ÿผ)
  • npm install --clean - npm install ์™€ ๋™์ผํ•œ ๋™์ž‘์ด์ง€๋งŒ node_modules ์ฝ˜ํ…์ธ  ์‚ญ์ œ
  • npm ci - npm install --from-lockfile --clean ๋Œ€ํ•œ ๋ณ„์นญ

@jdussouillez ์ด๊ฒƒ์ด ์ •ํ™•ํžˆ ์ผ์–ด๋‚˜์•ผ ํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ์•„์ฃผ ์ž˜ ๋งํ–ˆ๋‹ค! ์ด ์†”๋ฃจ์…˜์ด ์ ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

CI ํŒŒ์ดํ”„๋ผ์ธ์— ๋Œ€ํ•œ ์†๋„์™€ ์ผ๊ด€์„ฑ ์‚ฌ์ด์—์„œ ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๋Š” ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ•˜๋Š” ๊ฒƒ์€ ์ง€์†์ ์œผ๋กœ ์‹ค๋ง์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ง€๋‚œ 2๊ฐœ์›” ๋™์•ˆ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ 3~4๋ฒˆ ๋ฌธ์ œ๋ฅผ ๊ฒช์—ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์€ Azure Pipelines ๋ฐ ๊ธฐํƒ€ ํด๋ผ์šฐ๋“œ ์•„ํ‚คํ…์ฒ˜์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

https://docs.microsoft.com/en-us/azure/devops/pipelines/release/caching?view=azure-devops#tip

npm ci๋Š” ์ผ๊ด€๋˜๊ณ  ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ๋ชจ๋“ˆ ์ง‘ํ•ฉ์ด ์‚ฌ์šฉ๋˜๋„๋ก node_modules ํด๋”๋ฅผ ์‚ญ์ œํ•˜๋ฏ€๋กœ npm ci๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ node_modules ์บ์‹ฑ์„ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ซ๊ธฐ: @claudiahdz๊ฐ€ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด npm ci ๊ฐ€ ๋” ์ด์ƒ node_nodules ํด๋” ์ž์ฒด๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ์•Š๊ณ  ๋‚ด์šฉ๋งŒ ์ œ๊ฑฐํ•˜๋Š” ์ด ๋™์ž‘์— ๋Œ€ํ•œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค(์ฐธ์กฐ https://github.com/npm /libcipm/blob/latest/CHANGELOG.md#407-2019-10-09). ์ด๊ฒƒ์€ 7์›” 21์ผ์— [email protected] ๋กœ ๋ฐฐ์†ก๋˜์—ˆ์œผ๋ฉฐ(์ฐธ์กฐ https://github.com/npm/cli/blob/v6/CHANGELOG.md#6147-2020-07-21) npm@7 ์—์„œ ๋™์ผํ•œ ๊ฒฝํ—˜.

npm ci ๋˜๋Š” ๋‹ค๋ฅธ ๋ช…๋ น์— ๋ณ„๋„์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ ํ…œํ”Œ๋ฆฟ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ„๊ทธ๋ฅผ ์‹ ๊ณ  ํ•˜์„ธ์š” .


์ฐธ๊ณ ์‚ฌํ•ญ...

@jdussouillez ํ”ผ๋“œ๋ฐฑ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ž ๊ธˆ ํŒŒ์ผ์—์„œ ์ง์ ‘ ์„ค์น˜ํ•˜๋Š” ๊ฒฝ์šฐ --package-lock-only ํ”Œ๋ž˜๊ทธ(์˜ˆ: npm install --package-lock-only )๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์˜ค๋Š˜ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --clean ํ”Œ๋ž˜๊ทธ๋ฅผ install ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๊ฒƒ์ด ๋งŽ์€ ๊ฐ€์น˜๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๊ณ  ๋Š๋ผ์ง€๋Š” ์•Š์ง€๋งŒ ๋‚ด๊ฐ€ ํ‹€๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•ด ๊ฐ•ํ•˜๊ฒŒ ๋Š๋ผ์‹ ๋‹ค๋ฉด https://github.com/npm/rfcs ์—์„œ RFC๋ฅผ ์ œ์ถœํ•ด ์ฃผ์‹œ๊ธฐ

@claudiahdz๊ฐ€ ๊ฑฐ์˜ 1๋…„ ์ „์— npm ci ๋™์ž‘์ด ํด๋” ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ node_modules ์ฝ˜ํ…์ธ ๋ฅผ ์‚ญ์ œํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋„์ปค ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธํ•  ๋•Œ ํŽธ๋ฆฌํ•˜์ง€๋งŒ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. npm ci ๋Š” ๋ชจ๋“  ์ข…์†์„ฑ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์šด๋กœ๋“œ

npm install --package-lock-only ์‚ฌ์šฉํ•˜๋ฉด ์›๋ž˜ ๋ฌธ์ œ์™€ ์ •ํ™•ํžˆ ๋ฐ˜๋Œ€๋˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ดํ•ดํ•œ ๊ฒฝ์šฐ). package-lock.json ํŒŒ์ผ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ข…์†์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์›๋ž˜ ๋ฌธ์ œ์—์„œ ์ดํ•ดํ•œ ๊ฒƒ์€ node_modules ํด๋”์˜ ํ˜„์žฌ ์ƒํƒœ์™€ package-lock.json ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  node_modules ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. package-lock.json ์™€ ์ผ์น˜ํ•˜๋Š” node_modules ๋ฒ„์ „. ๋”ฐ๋ผ์„œ ๋งค๋ฒˆ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋ฉฐ ๊ฒฐ๊ตญ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm install ์ด๋ฏธ ํ•ญ์ƒ ํ•˜๋Š” ์ผ ์•„๋‹Œ๊ฐ€์š”?

npm install ์ด๋ฏธ ํ•ญ์ƒ ํ•˜๋Š” ์ผ ์•„๋‹Œ๊ฐ€์š”?

AFAIK -
npm install ๋Š” package.json ํŒŒ์ผ์— ๋”ฐ๋ผ ๋ชจ๋“  ์ข…์†์„ฑ์„ ํ•ด๊ฒฐํ•˜๊ณ ( package-lock.json ๋ฌด์‹œ), ํ˜„์žฌ node_modules ํด๋”์— ์žˆ๋Š” ๊ฒƒ๊ณผ ๋น„๊ตํ•˜๊ณ  ์š”๊ตฌ ์‚ฌํ•ญ์— ๋งž๊ฒŒ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ์ข…์†์„ฑ. ๊ทธ์— ๋”ฐ๋ผ package-lock.json ๋„ ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ lockfile์„ ๋ฌด์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค - ๋‹จ์ง€ npm ci ๊ฐ€ ํ•˜์ง€ ์•Š๋Š” ๊ธฐ์กด ํŠธ๋ฆฌ๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.
์ œ๊ฐ€ ์ž˜๋ชป ๊ธฐ์–ตํ–ˆ์Šต๋‹ˆ๋‹ค(๊ณผ๊ฑฐ์—๋Š” ๊ทธ๋Ÿฐ ํ–‰๋™์ด์—ˆ์„๊นŒ์š”?). ๊ฐ„๋‹จํ•œ dep ํŠธ๋ฆฌ๋กœ ๋ช‡ ๊ฐ€์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์œผ๋ฉฐ package-lock.json ํŒŒ์ผ์ด ์žˆ์„ ๋•Œ npm i ๋Š” ์ง€์ •๋œ ๋ฒ„์ „์„ ์ •ํ™•ํžˆ ์„ค์น˜ํ•˜๊ณ  ์•„๋ฌด ๊ฒƒ๋„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ฐพ๋˜ ํ–‰๋™์ด์—ˆ์œผ๋ฏ€๋กœ ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘
๋น„๊ณต๊ฐœ ๋ฌธ์ œ๋กœ ๊ธ€์„ ์˜ฌ๋ ค ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ์›๋ž˜ ์š”์ฒญ์€ ์‹ค์ œ๋กœ ATGardner๊ฐ€ ์„ค๋ช…ํ•œ ๋‚ด์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์›๋ž˜ ๋ฌธ์ œ์—์„œ ์ดํ•ดํ•œ ๊ฒƒ์€ node_modules ํด๋”์˜ ํ˜„์žฌ ์ƒํƒœ์™€ package-lock.json ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ค๊ณ  node_modules ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. package-lock.json ์™€ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งค๋ฒˆ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅด๋ฉฐ ๊ฒฐ๊ตญ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm install ๋‚˜์˜ ๊ฒฝํ—˜์€ ๋•Œ๋•Œ๋กœ package-lock.json ํŒŒ์ผ์„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์ž ์‹œ ๋™์•ˆ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๊ณ  git pull ๋ฐ npm i ์‹คํ–‰ํ•œ ์ €์žฅ์†Œ๋กœ ์˜ค๋Š˜ ์•„์นจ์— ์ด๊ฒƒ์„ ๋‹ค์‹œ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์‹ค์ œ๋กœ ์–ด๋–ค ๋ฒ„์ „๋„ ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•˜๊ณ  ์ผ๋ถ€ ์ข…์†์„ฑ๊ณผ ์ถ”๊ฐ€ ํŒจํ‚ค์ง€๋งŒ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
image
๋ถˆํ–‰ํžˆ๋„ ์ด๊ฒƒ์€ ๊ฐœ์ธ ์ €์žฅ์†Œ์ด์ง€๋งŒ ์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐœ ์ €์žฅ์†Œ๋กœ ๋‹ค๋ฅธ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์ด ์žˆ๊ณ  ๊ทธ ์‚ฌ์ด๋ฅผ ์ „ํ™˜ํ•˜๋ฉด npm install ๊ฐ€ package-lock.json ๋ฅผ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ปค๋ฐ‹ํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ ๊ด€๋ จ ์ผ๋ถ€ ์‚ฌ์šฉ์ž ์˜ค๋ฅ˜๊ฐ€์žˆ์„ ์ˆ˜ ์‹คํ˜„ package-lock.json ์—…๋ฐ์ดํŠธ ํ•  ๋•Œ package.json ํ•˜์ง€๋งŒ ๋‚ด ๋™๋ฃŒ๋“ค์ด ์—…๋ฐ์ดํŠธํ•ด์•ผํ•œ๋‹ค๊ณ  ์•Œ๊ณ  package-lock.json ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ. ๋‚˜๋Š” ์ด๊ฒƒ์„ ์กฐ์‚ฌํ•  ๊ฒƒ์ด๋‹ค.

npm i ๊ฐ€ package-lock.json ํŒŒ์ผ์„ ๋ณ€๊ฒฝํ•˜๋„๋ก ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ๋ฅผ ์–ป์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ข€ ๋” ์‹œ๋„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฒฝ์šฐ npm i ํ•ญ์ƒ์— ์ง€์ •๋œ ๋™์ผํ•œ ๋ฒ„์ „์˜ ๋‹ค์šด๋กœ๋“œ ๋ package-lock.json ๊ทธ๊ฒƒ์—์„œ ํ•  ์ˆ˜์žˆ๋Š”๋งŒํผ ์œ ์ง€ํ•˜๋ฉด์„œ, ํ˜„์žฌ node_modules , ๋‚ด๊ฐ€ ์™œ ์ง€๊ธˆ๊นŒ์ง€ ์‹คํ–‰ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค npm ci ? ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ๊ฒƒ์„ ์‚ญ์ œํ•˜๋ฉด ์–ด๋–ค ์ด์ ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ† ๋ก ์˜ ์žฅ์ด ๋˜์ง€ ๋ชปํ•œ ์  ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๋” ์ข‹์€ ๊ณณ์ด ๋˜ ์žˆ์„๊นŒ์š”?

๋‚˜๋Š” ์•„์ง๋„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค. ๋งŒ์•ฝ์˜ ์ƒํƒœ node_modules ์‹คํ–‰ ํ›„ npm i ์ •ํ™•ํžˆ ์ผ์น˜ package-lock.json , ๊ทธ๋ฆฌ๊ณ  ์ƒํƒœ๋ฅผ node_modules ์‹คํ–‰ ํ›„ npm ci ๋™์ผํ•œ์žˆ๋‹ค ์ตœ์ข… ๊ฒฐ๊ณผ - ๊ฑฐ์˜ ๋ชจ๋“  ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ตฌ์ถ• ์ค‘์ธ ์ปดํ“จํ„ฐ์— ์ด๋ฏธ ํด๋”์— ์ผ๋ถ€/๋Œ€๋ถ€๋ถ„์˜ ์ข…์†์„ฑ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด npm i ๊ฐ€ ๋” ๋น ๋ฅด์ง€ ์•Š์„๊นŒ์š”? ์ด๋ฏธ ๋กœ์ปฌ์— ์žˆ๋Š” ๊ฒƒ์„ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š๊ณ  ํ•„์š”ํ•œ ๋ฒ„์ „๊ณผ ์ผ์น˜ํ•ฉ๋‹ˆ๋‹ค.

์™œ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œํ• ๊นŒ์š”?

์•„๋‹ˆ์š”, npm ci ๋Š” deptree๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ๋” ๋น ๋ฅด๋ฉฐ ์ผ๋ถ€ ์ฝ˜์†” ์ถœ๋ ฅ์ด ์™„๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์™œ ๋ชจ๋“  ๊ฒƒ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์‚ญ์ œํ•˜๊ณ  ๋‹ค์šด๋กœ๋“œํ• ๊นŒ์š”?

๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ci ๋Š” ๋ฐฐํฌ์™€ ๊ฐ™์€ ํŠน์ • ํ™˜๊ฒฝ์„ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋ฌธ์„œ์—์„œ ์ด๋ฏธ ์ฐจ์ด์ ์„ ์–ธ๊ธ‰ํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠน์ • ์‚ฌ์šฉ์ž ์ง€ํ–ฅ ๊ธฐ๋Šฅ์„ ๊ฑด๋„ˆ๋›ฐ๋ฉด ์ผ๋ฐ˜ npm ์„ค์น˜๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ผ๋ฐ˜ ์„ค์น˜๋ณด๋‹ค ๋” ์—„๊ฒฉํ•˜๋ฏ€๋กœ ๋Œ€๋ถ€๋ถ„์˜ npm ์‚ฌ์šฉ์ž๊ฐ€ ์ ์ง„์ ์œผ๋กœ ์„ค์น˜ํ•˜๋Š” ๋กœ์ปฌ ํ™˜๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์˜ค๋ฅ˜๋‚˜ ๋ถˆ์ผ์น˜๋ฅผ ํฌ์ฐฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://blog.npmjs.org/post/171556855892/introducing-npm-ci-for-faster-more-reliable ๋„

npm ci ๋Š” ์—ฌ์ „ํžˆ ๋น ๋ฆ…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ npm i ์‚ฌ์šฉํ•  ๋•Œ ํ˜„์žฌ node_modules ๋ฅผ ์ฝ๊ณ  ์–ด๋–ค ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ npm์—์„œ ๋ชจ๋“  ํŒจํ‚ค์ง€๋ฅผ ์‹ค์ œ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๋ณด๋‹ค ํ›จ์”ฌ ํฝ๋‹ˆ๋‹ค. ์„œ๋ฒ„? ๊ทธ๊ฒƒ์„ ์ธก์ •ํ•˜๋Š” ์‹ค์ œ ์‹คํ—˜์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” ๋˜ํ•œ ์ด ๋‹จ๋ฝ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค -

npm ci bypasses a packageโ€™s package.json to install modules from a packageโ€™s lockfile. This ensures reproducible buildsโ€”you are getting exactly what you expect on every install.

npm i ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ package-lock.json ํŒŒ์ผ์˜ ์ •ํ™•ํ•œ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹คํ–‰ ํ›„ node_modules ์˜ ์ƒํƒœ๋Š” ์‹คํ–‰๋  ์ƒํƒœ์™€ ๋™์ผํ•˜๋‹ค๋Š” ๊ฒฐ๋ก ์„ ๋‚ด๋ฆฌ์ง€ ์•Š์•˜์Šต๋‹ˆ๊นŒ? npm ci ์‹คํ–‰ํ•œ ํ›„์ž…๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ๋นŒ๋“œ๋Š” ๊ทธ๋Œ€๋กœ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—…๋ฐ์ดํŠธ:

๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ…Œ์ŠคํŠธ๋ฅผ ํ–ˆ๋‹ค -
์ƒˆ๋กœ์šด create-react-app ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๊ฐ€ ์™„๋ฃŒ๋œ ํ›„ package.json ์—๋Š” 7๊ฐœ์˜ ์ง์ ‘ ์ข…์†์„ฑ์ด ์žˆ๊ณ  package-lock.json ์—๋Š” 1982๊ฐœ์˜ ํŒจํ‚ค์ง€๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ƒํƒœ์—์„œ( node_modules ์—๋Š” ๋ชจ๋“  ์ข…์†์„ฑ์ด ํฌํ•จ๋จ) - npm i ํ•˜๋ฉด

real    0m2.548s
user    0m2.659s
sys     0m0.182s

๋‹จ์ผ ํŒจํ‚ค์ง€ ํด๋”( node_modules/babel-eslint )๋ฅผ ์‚ญ์ œํ•œ ๋‹ค์Œ npm i ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด

real    0m3.295s
user    0m3.543s
sys     0m0.434s

๋ˆ„๋ฝ๋œ ์ข…์†์„ฑ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด

์ „์ฒด node_moduels ํด๋”๋ฅผ ์‚ญ์ œํ•˜๊ณ  npm i ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด

real    0m16.701s
user    0m19.251s
sys     0m10.379s

npm ci ์‹คํ–‰ํ–ˆ์„ ๋•Œ

real    0m20.997s
user    0m23.844s
sys     0m14.857s

๋‹จ์ผ ํŒจํ‚ค์ง€๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์ „์ฒด node_modules ํด๋”๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•ด๋„ ์ด๋Š” ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. npm ci ๋Š” ์–ด์จŒ๋“  node_modules ์˜ ๋‚ด์šฉ์„ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋†€๋ผ์šด ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค diff -q -r node_modules_orig/ node_modules/ ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ฒฐ๊ณผ๊ฐ€ ์›๋ž˜ ์ข…์†์„ฑ๊ณผ ๋™์ผํ•œ์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ทธ๋žฌ๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ npm ci ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ node_modules ์˜ ํ˜„์žฌ ์ƒํƒœ์— ๊ด€๊ณ„์—†์ด ๋‚ด ์ปดํ“จํ„ฐ์—์„œ ~21์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ npm i ์ตœ๊ทผ์— ๋ณต์ œ ํ”„๋กœ์ ํŠธ (NO node_modules ) ์†Œ์š” ~ 18์ดˆ ๋ฐ ์ข…์† ๋ณ€๊ฒฝ๋œ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค (ํ˜„์žฌ node_modules ํ•„์š”ํ•œ ์ข…์†์„ฑ์„ ์ผ์น˜ ) ~3์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์–ธ์ œ npm ci ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„๊นŒ์š”? ๋” ๋นจ๋ผ ๋ณด์ด์ง€๋Š” ์•Š์ง€๋งŒ(๋ฌผ๋ก  ์ด๊ฒƒ์€ ๋‹จ์ผ ํ…Œ์ŠคํŠธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค) ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” npm i ์™€ ๋™์ผํ•˜๋ฏ€๋กœ ํ›„์† ๋นŒ๋“œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•ˆ์ •์ ์ž…๋‹ˆ๋‹ค.

npm ci ๋Š” package-lock.json ์— ์žˆ๋Š” ๊ฒƒ ์™ธ์—๋Š” _์ •ํ™•ํžˆ_ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์— ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค. npm i ๋Š” package-lock.json ์žˆ๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ์„ค์น˜ํ•œ๋‹ค๊ณ  ๋ณด์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. package-lock.json ๋Š” npm i ๋Œ€ํ•œ ์ž…๋ ฅ์ด์ง€๋งŒ ์ถœ๋ ฅ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” npm i ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์„ ์„ค์น˜(๋”ฐ๋ผ์„œ package-lock.json ์ˆ˜์ •)ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋งŒ ๋‚จ์•„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ์‹œ ์‚ญ์ œ๋œ ํŒจํ‚ค์ง€ ๋ฒ„์ „์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

npm ci ๊ฐ€ ์ฒ˜์Œ ์†Œ๊ฐœ๋˜์—ˆ์„ ๋•Œ npm i ๋Š” package-lock.json ์™„์ „ํžˆ ๋ฌด์‹œํ–ˆ๊ฑฐ๋‚˜ ์ตœ์†Œํ•œ ๋‹ค๋ฅธ ๋ฒ„์ „์„ ์„ค์น˜ํ•˜๋Š” ๋ฐ ํ›จ์”ฌ ๋” ์ ๊ทน์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

์–ด๋Š ์ชฝ์ด๋“ , ๊ทธ๊ฒƒ์€ ์ •๋ง๋กœ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. npm ci ๋Š” node_modules ํด๋”๊ฐ€ ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š์„ ๋•Œ๋งŒ OK์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ํŠนํžˆ Windows์—์„œ ์—„์ฒญ๋‚˜๊ฒŒ ๋Š๋ฆฝ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ npm i ๋Š” package-lock.json ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  package-lock.json ๋‚ด๋ถ€์— ์žˆ๋Š” ๊ฒƒ์„ ์ •ํ™•ํžˆ ์„ค์น˜ํ•˜์ง€ ์•Š์„ _๋ณด์žฅ_ ํ”Œ๋ž˜๊ทธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด์œ ์™€ ๋ฐฉ๋ฒ•์„ ๋” ์ด์ƒ ๋…ผ์˜ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ์–ป๊ฑฐ๋‚˜ ์–ป์ง€ ๋ชปํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ, npm ci ์งœ์ฆ๋‚˜.

/์—…๋ฐ์ดํŠธ:
์—ฌ๊ธฐ์— ์‹คํ–‰ํ•˜๋Š” ํ™˜๋งค ํŠน์•ฝ์˜ npm i ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค์€ package-lock.json : https://github.com/fuzzykiller/npm-install-demo

๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋ณธ์งˆ์ ์œผ๋กœ ๊ธฐ์ˆ ์ ์ผ ๋ฟ์ด์ง€๋งŒ ์—ฌ์ „ํžˆ ํ—ˆ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋นจ๋ฆฌ ๋ฐ˜๋ณตํ•˜์ž๋ฉด:

  • npm ci ๋Š” ์˜๋„์ ์œผ๋กœ node_modules ์˜ ์ฝ˜ํ…์ธ ๋ฅผ ํ•ญ์ƒ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋Š๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ๋น„ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ package-lock.json ์— ์žˆ๋Š” ์ •ํ™•ํ•œ ๋ฒ„์ „์˜ ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

  • npm install ๋Š” node_modules ์˜ ๋‚ด์šฉ์„ ์—…๋ฐ์ดํŠธํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์ด ๋งค์šฐ ์šฐ์ˆ˜ํ•˜์ง€๋งŒ package.json ๋ฒ„์ „ ๋ฒˆํ˜ธ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ package-lock.json ์˜ ๋‚ด์šฉ์„ ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์ƒํ™ฉ์— ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • npm install --package-lock-only ๋Š” ๋ฌธ์„œ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

    --package-lock-only ์ธ์ˆ˜๋Š” node_modules๋ฅผ ํ™•์ธํ•˜๊ณ  ์ข…์†์„ฑ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋Œ€์‹  package-lock.json๋งŒ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค.

    ์ด๊ฒƒ์€ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ์œ ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ง€๋‚œ 3๋…„ ๋™์•ˆ ์‚ฌ๋žŒ๋“ค์ด ์š”๊ตฌํ•œ ๊ฒƒ:

  1. package.json ๋ฌด์‹œํ•˜๊ณ  package-lock.json ๋ฅผ ์„ค์น˜ํ•  ํŒจํ‚ค์ง€์˜ ์ตœ์ข… ์†Œ์Šค๋กœ _only_ ์กด์ค‘ํ•˜๋Š” ๋ช…๋ น(์–ด๋””์„œ๋‚˜).

  2. node_modules ์˜ ์ „์ฒด ๋‚ด์šฉ์„ ์‚ญ์ œํ•˜์ง€ ์•Š๊ณ  ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค์‹œ ๋‹ค์šด๋กœ๋“œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ์™€ ๋กœ์ปฌ ํ…Œ์ŠคํŠธ์—์„œ ๋ชจ๋‘ ๋ณผ ์ˆ˜ ์žˆ๋Š” ํ•œ npm install ๋Š” 2 npm ci ์ถฉ์กฑํ•˜์ง€๋งŒ 1 npm ci 1 npm install --package-lock-only ์ถฉ์กฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ์š”๊ตฌ ์‚ฌํ•ญ์˜.

์ด ๋ฌธ์ œ๊ฐ€ ์ข…๋ฃŒ๋œ ์ด์œ ๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉฐ ์›ํ•˜๋Š” ๋™์ž‘์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์•„์ง ์—†์Šต๋‹ˆ๋‹ค.


ํŽธ์ง‘: @fuzzykiller ์˜ ์˜ˆ๋ฅผ ํ™•์žฅํ•˜๋ ค๋ฉด package-lock.json ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์„ฑ๊ฐ€์‹  ์ผ์ด์ง€๋งŒ ๋‚ด ๋นŒ๋“œ๋ฅผ ์†์ƒ์‹œํ‚ค์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ package.json ์— ํผ์ง€ ์ข…์†์„ฑ์ด ๋‚˜์—ด๋˜์–ด ์žˆ๊ณ  ํ•ด๋‹น ์ข…์†์„ฑ์˜ bugfix ๋ฒ„์ „์ด ๋ฆด๋ฆฌ์Šค๋˜๋ฉด ์ƒˆ ์ปดํ“จํ„ฐ์—์„œ npm install ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค. ๊ฐ‘์ž๊ธฐ ๋‘ ๊ธฐ๊ณ„ ์‚ฌ์ด์— ์ฐจ์ด์ ์„ ์„ค์น˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ํšŒ์‚ฌ์—์„œ ์ •ํ™•ํžˆ ์ด ๋™์ž‘์œผ๋กœ ์ธํ•ด ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. package-lock.json ๋ฅผ Git์— ๋‹ค์‹œ ์ฒดํฌ์ธํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋Š” npm ci ์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ช…๋ น์€ package-lock.json ์˜ ๋‚ด์šฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ _๋งŒ_ ์žฌ์ƒ ๊ฐ€๋Šฅํ•œ ์„ค์น˜๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ node_modules ํด๋”์˜ ๋‚ด์šฉ์„ ์‚ญ์ œํ•˜๋ฉด ์ผ๋ถ€ ํ™˜๊ฒฝ๊ณผ ์ƒํ™ฉ์—์„œ๋Š” ๋นŒ๋“œ ์†๋„๊ฐ€ ๋„ˆ๋ฌด ๋Š๋ ค์ง€์ง€๋งŒ ์ตœ์ข… ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์—๋Š” ์ ์ ˆํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์–ด๋””์—๋‚˜ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. npm install --from-lockfile ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. npm ci --preserve-existing ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ง€๊ธˆ ์šฐ๋ฆฌ๋Š” npm install ํ”Œ๋ž˜๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ํ•ด๊ฒฐ์ฑ…์œผ๋กœ npm ci ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ํ”Œ๋ž˜๊ทธ๋ฅผ ์š”์ฒญํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ๋‚˜ ์› ์•ˆ์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. npm ci ๋Š” ์†”๋ฃจ์…˜์œผ๋กœ npm install ๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” npm install --package-lock-only ๊ฐ€๋ฆฌํ‚ค๋ฉฐ ์ข…๋ฃŒ๋˜์—ˆ์ง€๋งŒ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ๋Š” ์‚ฌ๋žŒ๋“ค์ด ์š”๊ตฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. package-lock.json ๋ฅผ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ์†Œ์Šค๋กœ ๊ฐ„์ฃผํ•˜์ง€ ์•Š์œผ๋ฉฐ node_modules ํด๋”์˜ ์ข…์† ํ•ญ๋ชฉ๋„ ์—…๋ฐ์ดํŠธํ•˜๊ฑฐ๋‚˜ ์„ค์น˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. :)

์ด ๋ฌธ์ œ๋Š” ๋‹ค์‹œ ์—ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰