๋น๋ ์๋ฒ์์ ์ฆ๋ถ ์
๋ฐ์ดํธ๋ฅผ ์ํํ๊ธฐ ์ํด npm ci --keep
์ ๊ฐ์ ํ๋๊ทธ๋ฅผ ๋ณด๊ณ ์ถ์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐฐํฌ ์๋๊ฐ ํจ์ฌ ๋นจ๋ผ์ง ๊ฒ์
๋๋ค. github ๋ฐ ์ปค๋ฎค๋ํฐ์์ ์ด์ ์ ์ ์ ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค . ๋ง์ง๋ง ์
๋ฐ์ดํธ๋ 10์ 7์ผ ์ cli ํ์์ ๊ฒํ ์ค์ด์์ต๋๋ค. ๋๊ตฐ๊ฐ ์ด์ ๋ํ ์
๋ฐ์ดํธ๋ฅผ ๊ฒ์ํ ์ ์์ต๋๊น? :-)
์ด๊ฒ์ 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
์คํํ ์ ์ฅ์๋ก ์ค๋ ์์นจ์ ์ด๊ฒ์ ๋ค์ ํ
์คํธํ์ต๋๋ค. ์ด๋ฒ์๋ ์ค์ ๋ก ์ด๋ค ๋ฒ์ ๋ ์
๋ฐ์ดํธํ์ง ์์๊ณ ์ผ๋ถ ์ข
์์ฑ๊ณผ ์ถ๊ฐ ํจํค์ง๋ง ์ถ๊ฐํ์ต๋๋ค.
๋ถํํ๋ ์ด๊ฒ์ ๊ฐ์ธ ์ ์ฅ์์ด์ง๋ง ์ฌํ ๊ฐ๋ฅํ ๊ณต๊ฐ ์ ์ฅ์๋ก ๋ค๋ฅธ ๋๊ตฐ๊ฐ๊ฐ ์์ต๋๊น? ์ฌ๋ฌ ์ปค๋ฐ์ด ์๊ณ ๊ทธ ์ฌ์ด๋ฅผ ์ ํํ๋ฉด 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๋ ๋์ ์ฌ๋๋ค์ด ์๊ตฌํ ๊ฒ:
package.json
๋ฌด์ํ๊ณ package-lock.json
๋ฅผ ์ค์นํ ํจํค์ง์ ์ต์ข
์์ค๋ก _only_ ์กด์คํ๋ ๋ช
๋ น(์ด๋์๋).
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
ํด๋์ ์ข
์ ํญ๋ชฉ๋ ์
๋ฐ์ดํธํ๊ฑฐ๋ ์ค์นํ์ง ์์ต๋๋ค. :)
์ด ๋ฌธ์ ๋ ๋ค์ ์ด์ด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ด ๋ด๊ฐ ์๋ฒฝํ ์ธ์์์ ์๋ํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
npm install
- ์ค๋๊ณผ ๊ฐ์ ๋์npm install --from-lockfile
- ์ ๊ธ ํ์ผ์์ ์ค์น(ci
์ฒ๋ผ)npm install --clean
-npm install
์ ๋์ผํ ๋์์ด์ง๋งnode_modules
์ฝํ ์ธ ์ญ์ npm ci
-npm install --from-lockfile --clean
๋ํ ๋ณ์นญ