๐ฅ npm install ์์ ํด๋ถ โ lock ํ์ผ, node_modules, npm ci
๐ ๊ฐ์
npm install ์ ๋ด๋ถ ๋์, package-lock.json ์ ๊ตฌ์กฐ์ ์ญํ , node_modules ํธ์ด์คํ ์๋ฆฌ, npm ci ๊ฐ ํ์ํ ์ด์ ๋ฅผ ์๋ฒฝํ ์ดํดํ๋ค.
๐ ๋ชฉ์ฐจ
- ๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
- ๐ค ์ ์์์ผ ํ๋๊ฐ
- ๐ package-lock.json ์ ๊ตฌ์กฐ์ ์ญํ
- โ๏ธ npm install vs npm ci
- ๐ณ node_modules ์ ๊ตฌ์กฐ
- ๐ป ํฌํ ์์กด์ฑ
- ๐งน node_modules ๊ด๋ฆฌ ๋ช ๋ น์ด
- โ๏ธ .npmrc ๋ก install ๋์ ์ ์ด
- ๐ ์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ ์ด์ ๋ฆฌ
- ๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
- ๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
- ๐ ๋ ์์๋ณด๊ธฐ
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 20๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 8๋ถ (lock ํ์ผ + npm ci)
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
lock ํ์ผ ๊ตฌ์กฐ ์ดํด โ npm install vs npm ci โ node_modules ํธ์ด์คํ
โ ํฌํ
์์กด์ฑ ํจ์ โ .npmrc ์ค์
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
-
package-lock.json์ ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ์ฝ๊ณintegrityํ๋๊ฐ ๋ฌด์์ ๋ณด์ฅํ๋์ง ์ค๋ช ํ ์ ์๋ค -
npm install๊ณผnpm ci์ ๊ฒฐ์ ์ ์ฐจ์ด๋ฅผ ์ํฉ์ ๋ง๊ฒ ์ ํํด ์ฌ์ฉํ ์ ์๋ค -
node_modules์ ํ๋ซ ๊ตฌ์กฐ์ ํธ์ด์คํ ์๋ฆฌ๋ฅผ ์ดํดํ๋ค - ํฌํ ์์กด์ฑ์ด ๋ฌด์์ด๊ณ ์ ์ํํ์ง ์ค๋ช ํ ์ ์๋ค
-
.npmrc๋กengine-strict,save-exact๋ฑ์ ์ค์ ํ ์ ์๋ค
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์
): "๋ฆฌ๋ ๋, CI ์์ ๊ณ์ ๋น๋๊ฐ ์คํจํด์. ๋ก์ปฌ์์๋ ์๋ฒฝํ๋ฐ... GitHub Actions ๋ก๊ทธ ๋ณด๋๊น
npm installํ ๋๋ง๋ค ๋ฒ์ ์ด ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง๋ ๊ฒ ๊ฐ์์. ๊ทธ๋ฆฌ๊ณpackage-lock.json์ด ์์ฒญ ๊ธธ์ด์ ๋ญ ๋ด์ฉ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ด์. ์ฝ์ด์ผ ํ๋์? ๊ทธ๋ฅ ์๋ ์์ฑ์ด๋๊น ์ ๊ฒฝ ์ ์จ๋ ๋๋ ๊ฑฐ ์๋๊ฐ์?" - ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, CI ์์
npm install๋์npm ci๋ฅผ ์จ์ผ ํด์.npm install์ lock ํ์ผ์ ๊ฐฑ์ ํ ์ ์์ด์ ๋งค ๋น๋๋ง๋ค ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง ์ ์๊ฑฐ๋ ์.package-lock.json์ ์ฝ์ ํ์๋ ์์ง๋ง, ์ด๊ฒ ์ด๋ค ์ญํ ์ ํ๋์ง ์์์ผ ์ CI ์์npm ci๋ฅผ ์จ์ผ ํ๋์ง ์ดํดํ ์ ์์ด์."
๐ค ์ ์์์ผ ํ๋๊ฐ
"์ ๋ก์ปฌ์์๋ ๋๋๋ฐ CI ์์๋ง ์ ๋ผ์" โ ๊ฐ๋ฐ์ ์ธ๊ณ์์ ๊ฐ์ฅ ๊ณ ํต์ค๋ฌ์ด ๋ฌธ์ฅ ์ค ํ๋๋ค.
์์๋ค ํ์ด ๋ฐฐํฌ ์ ๋ ๋ฐค์ ์ด ์ํฉ์ ๋ง๋ฌ๋ค. ์์ฒ ์ด ๋ก์ปฌ์์๋ ๋น๋๊ฐ ์๋ฒฝํ๋ฐ, GitHub Actions ์์๋ ๊ณ์ ํ์
์๋ฌ๊ฐ ๋ฌ๋ค. ์์ธ์ ์ฐพ์๋ณด๋ ๋ก์ปฌ์ typescript@5.2.0 ๊ณผ CI ์ typescript@5.3.3 ์ด ๋ฌ๋๋ค. CI ์์ npm install ์ ์คํํ ๋๋ง๋ค lock ํ์ผ์ด ์์ด์ ๊ทธ๋๊ทธ๋ ์ต์ ๋ฒ์ ์ ๊ฐ์ ธ์๋ ๊ฒ์ด๋ค.
package-lock.json ๊ณผ npm ci ๋ฅผ ์ ๋๋ก ์ดํดํ๋ฉด ์ด๋ฐ ์ผ์ ์ ๋ ์ผ์ด๋์ง ์๋๋ค.
๐ package-lock.json ์ ๊ตฌ์กฐ์ ์ญํ
ํต์ฌ ์ญํ โ ์ฌํ ๊ฐ๋ฅํ ๋น๋ ๋ณด์ฅ
package.json = "์๋" โ react@^18.2.0 ๋ฒ์๋ฉด ๋จ
package-lock.json = "๊ณต์ฆ" โ ์ค๋ 18.2.0 ์ ์ค์นํ๊ณ , ์ด tarball ์ ํด์๊ฐ์ xxx ์
lock ํ์ผ์ ์ค์ ๊ตฌ์กฐ
{
"name": "youngsoo-community",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "youngsoo-community",
"version": "1.0.0",
"dependencies": {
"react": "^18.2.0"
}
},
// ๐ก node_modules ์์ ์ค์ ๋ก ์ด๋ค ํ์ผ์ด ๋ค์ด๊ฐ๋๋! ํ๋ ์ค๋ฌผ ์ฅ๋ถ์
๋๋ค.
"node_modules/react": {
"version": "18.2.0", // ๐ฆ ^18.2.0 ๋ฒ์ ์ค์์ "์ ํํ ์ด ๋ฒ์ "์ ๊น์๋ค๊ณ ๋ช
์ํฉ๋๋ค.
"resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz",
// [์ดํต์ฌ] ์ด ํ์ผ์ ์ง๋ฌธ(ํด์๊ฐ)์
๋๋ค. ํ์ผ์ด 1๋ฐ์ดํธ๋ผ๋ ๋ค๋ฅด๋ฉด ์ฌ๊ธฐ์ ๊ฑธ๋ฌ์ง๋๋ค.
"integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fA==",
"engines": {
"node": ">=0.10.0"
}
}
}
}| ํ๋ | ์๋ฏธ |
|---|---|
lockfileVersion | lock ํ์ผ ํฌ๋งท ๋ฒ์ (npm v9+ ๋ 3) |
version | ์ค์ ๋ก ์ค์น๋ ์ ํํ ๋ฒ์ |
resolved | tarball ์ ๋ฐ์์จ URL |
integrity | SHA-512 ํด์๊ฐ โ ํ์ผ ์๋ณ์กฐ ์ฌ๋ถ ๊ฒ์ฆ |
๐
integrity์ ์ญํ : ์ ์์ ์ธ ๊ณต๊ฒฉ์๊ฐ npm ๋ ์ง์คํธ๋ฆฌ๋ฅผ ์กฐ์ํด ๋ค๋ฅธ ์ฝ๋๋ฅผ ์ฃผ์ ํ๋๋ผ๋,integrityํด์๊ฐ ์ผ์นํ์ง ์์ผ๋ฉด npm ์ด ์ค์น๋ฅผ ๊ฑฐ๋ถํ๋ค. ์ด๊ฒ์ด ๊ณต๊ธ๋ง ๊ณต๊ฒฉ(supply chain attack) ์ ๋ง๋ ์ฒซ ๋ฒ์งธ ๋ฐฉ์ด์ ์ด๋ค.
lock ํ์ผ ๋ฒ์ ํธํ์ฑ
lockfileVersion | npm ๋ฒ์ | ์ฃผ์์ฌํญ |
|---|---|---|
| 1 | npm v5, v6 | ๊ตฌ๋ฒ์ |
| 2 | npm v7, v8 | v1 ํ์ ํธํ |
| 3 | npm v9+ | v2 ํ์ ํธํ |
ํ์ ์ค npm ๋ฒ์ ์ด ๋ค๋ฅด๋ฉด lock ํ์ผ์ด ๊ณ์ ๋ณ๊ฒฝ๋ ์ ์๋ค. .npmrc ๋ก npm ๋ฒ์ ์ ํต์ผํ๊ฑฐ๋ engines ์ "npm": ">=9.0.0" ์ ๋ช
์ํ๋ค.
์ ๋ ๊ท์น
โ
package-lock.json โ ๋ฐ๋์ git ์ปค๋ฐ
โ node_modules/ โ ๋ฐ๋์ .gitignore ์ถ๊ฐ
# .gitignore
node_modules/
.next/โ๏ธ npm install vs npm ci โ ๊ฒฐ์ ์ ์ฐจ์ด
npm install
npm installpackage.json๊ธฐ์ค์ผ๋ก ๋์- ํ์ฉ ๋ฒ์ ๋ฒ์ ๋ด์์ ์ต์ ๋ฒ์ ์ ํ ๊ฐ๋ฅ
package-lock.json์ ๊ฐฑ์ ํ ์ ์์- ๊ธฐ์กด
node_modules๋ฅผ ์ฌ์ฌ์ฉ (์๋ ์ฐ์ ) - ์ฌ์ฉ ์์ : ๊ฐ๋ฐ ์ค ์ ํจํค์ง๋ฅผ ์ถ๊ฐํ๊ฑฐ๋, ๋ฒ์ ์ ์ฌ๋ฆด ๋
npm ci
npm cipackage-lock.json๊ธฐ์ค์ผ๋ก ๋์ (์ ํํ ๋ฒ์ ๋ง)package-lock.json์ ์ ๋ ๊ฐฑ์ ํ์ง ์์ (lock ์์ผ๋ฉด ์๋ฌ)- ๊ธฐ์กด
node_modules๋ฅผ ์ญ์ ํ ์ฒ์๋ถํฐ ์ค์น - ๋ ์๊ฒฉํ๊ณ ์์ธก ๊ฐ๋ฅํ ์ค์น
- ์ฌ์ฉ ์์ : CI/CD ํ๊ฒฝ, Docker ์ด๋ฏธ์ง ๋น๋, ํ๋ก๋์ ๋ฐฐํฌ
npm install npm ci
๊ธฐ์ค ํ์ผ package.json package-lock.json
lock ๋ณ๊ฒฝ ๊ฐ๋ฅ ๋ถ๊ฐ (์๋ฌ ๋ฐ์)
lock ์์ผ๋ฉด ์๋ก ์์ฑ ์๋ฌ๋ก ์ข
๋ฃ
node_modules ์ฌ์ฌ์ฉ ์ญ์ ํ ์ฌ์ค์น
์๋ ๋ณดํต ๋น ๋ฆ (์ด๊ธฐํ ํ ์บ์ ์ฌ์ฉ ์)
์์ ์ฑ ๋ฎ์ ๋์
๐ฅ ์ค๋ฌด ํฉ๊ธ ๊ท์น:
- ๋ก์ปฌ ๊ฐ๋ฐ:
npm install- CI/CD: ๋ฌด์กฐ๊ฑด
npm ci- Docker Dockerfile:
RUN npm ci --omit=dev
# โ
GitHub Actions ์ฌ๋ฐ๋ฅธ ์ค์ : 'npm install'์ ์ ๋ ๊ธ์ง! 'npm ci'๊ฐ ์ ๋ต์
๋๋ค.
- name: Install dependencies
run: npm ci
# โ
Dockerfile ์ฌ๋ฐ๋ฅธ ์ค์ : ํ๋ก๋์
์ด๋ฏธ์ง์๋ ์ฉ๋ ๋ค์ด์ดํธ๋ฅผ ์ํด devDependencies๋ฅผ ๋บ๋๋ค.
RUN npm ci --omit=dev ๐ณ node_modules ์ ๊ตฌ์กฐ โ ํธ์ด์คํ ๊ณผ ์ค์ฒฉ
npm v3+ ์ ํ๋ซ(Flat) ๊ตฌ์กฐ
npm v2 ์ดํ์์๋ ๋ชจ๋ ์์กด์ฑ์ด ์ค์ฒฉ ๊ตฌ์กฐ๋ก ์ค์น๋๋ค:
# npm v2 (๊ตฌ๋ฒ์ โ ์ค์ฒฉ ๊ตฌ์กฐ)
node_modules/
react-dom/
node_modules/
react/ โ react-dom ์ react
next/
node_modules/
react/ โ next ์ react (์ค๋ณต!)
react-dom/ โ next ์ react-dom (์ค๋ณต!)
์ค๋ณต์ด ๋๋ฌด ๋ง์ node_modules ํฌ๊ธฐ๊ฐ ํญ๋ฐ์ ์ผ๋ก ์ปค์ก๋ค.
npm v3+ ๋ ํธ์ด์คํ (Hoisting) ์ผ๋ก ์ด๋ฅผ ํด๊ฒฐํ๋ค:
# npm v3+ (ํ๋ซ ๊ตฌ์กฐ โ ํธ์ด์คํ
)
node_modules/
react/ โ ์ต์์๋ก ์ฌ๋ผ์ด (ํธ์ด์คํ
)
react-dom/ โ ์ต์์๋ก ์ฌ๋ผ์ด
next/ โ react ์์, ์์ react ๊ณต์
some-lib/ โ react ์์, ์์ react ๊ณต์
๋ชจ๋ ํจํค์ง๊ฐ react@18.2.0 ์ ์๊ตฌํ๋ฉด ์ต์์์ ํ๋๋ง ๋๊ณ ๋ชจ๋ ๊ณต์ ํ๋ค.
๋ฒ์ ์ด ๋ค๋ฅผ ๋ โ ์ค์ฒฉ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ
node_modules/
react/ โ v18.2.0 (ํธ์ด์คํ
)
old-library/
node_modules/
react/ โ v16.14.0 (old-library ๊ฐ 16 ๋ฒ์ ์๊ตฌ)
old-library ๊ฐ React 16 ์ ์๊ตฌํ๊ณ ๋ฉ์ธ ์ฑ์ React 18 ์ ์ฐ๋ฉด, ๋ ๋ฒ์ ์ด ๊ณต์กดํ๋ค. ์ด๊ฒ์ด node_modules ํฌ๊ธฐ๊ฐ ์ปค์ง๊ณ peerDependencies ์ถฉ๋์ด ์๊ธฐ๋ ์์ธ์ด๋ค.
๐ป ํฌํ ์์กด์ฑ โ ์ค์นํ ์ ์๋๋ฐ ์ธ ์ ์๋ ์ด์ ์ ํจ์
ํธ์ด์คํ ์ ๋ถ์์ฉ์ผ๋ก ํฌํ ์์กด์ฑ(Phantom Dependency) ์ด ์๊ธด๋ค.
// ๋ด package.json
{
"dependencies": {
"next": "^14.1.0"
}
}// ๋ด ์ฝ๋ โ ์ง์ ์ค์นํ์ง ์์ lodash ๋ฅผ import!
import merge from 'lodash/merge' // โ ํฌํ
์์กด์ฑnext ๊ฐ ๋ด๋ถ์ ์ผ๋ก lodash ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, node_modules/lodash ๊ฐ ํธ์ด์คํ
์ผ๋ก ์ต์์์ ์กด์ฌํ๋ค. ๋ด๊ฐ ์ค์นํ ์ ์์ด๋ import ๊ฐ ๋์ํ๋ค.
์ ์ด๊ฒ ์ํํ๊ฐ?
์ค๋: next@14.1.0 ์ด lodash@4.17.21 ์ ์ฌ์ฉ โ ๋ด ์ฝ๋์์ ์ธ ์ ์์
๋ฏธ๋: next@14.2.0 ์ด lodash ์์กด์ฑ ์ ๊ฑฐ โ ๋ด ์ฝ๋๊ฐ ๊ฐ์๊ธฐ ์๋ฌ
๋ด๊ฐ ์๋ฌด๊ฒ๋ ๋ฐ๊พธ์ง ์์๋๋ฐ ์๋น์ค๊ฐ ๋ง๊ฐ์ง
ํด๊ฒฐ: ์ง์ ์ฌ์ฉํ๋ ํจํค์ง๋ ๋ฐ๋์ ๋ช ์์ ์ผ๋ก ์ค์นํ๋ค.
npm install lodash # ์ง์ ์ค์น// package.json ์ ๋ช
์๋จ
{
"dependencies": {
"lodash": "^4.17.21",
"next": "^14.1.0"
}
}๐ก pnpm ์ด ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ์: pnpm ์ ํ๋๋งํฌ + ์ฌ๋ณผ๋ฆญ ๋งํฌ ๊ตฌ์กฐ๋ก ํฌํ ์์กด์ฑ์ ์์ฒ ์ฐจ๋จํ๋ค. ๋ช ์์ ์ผ๋ก ์ค์นํ์ง ์์ ํจํค์ง๋ import ์์ฒด๊ฐ ์๋ฌ๋๋ค. ๋๊ท๋ชจ ๋ชจ๋ ธ๋ ํฌ์์ pnpm ์ด ์ ํธ๋๋ ์ด์ ์ค ํ๋๋ค.
๐งน node_modules ๊ด๋ฆฌ ๋ช ๋ น์ด
# ์ค๋ณต ์์กด์ฑ ์ ๋ฆฌ
npm dedupe # ์ค๋ณต ํจํค์ง๋ฅผ ์ ๊ฑฐํ๊ณ ๊ณต์ ๊ฐ๋ฅํ ๊ฒ์ ํธ์ด์คํ
# ํ์ฌ ์ค์น๋ ํจํค์ง ๋ชฉ๋ก
npm list # ์ ์ฒด ํธ๋ฆฌ
npm list --depth=0 # ์ง์ ์์กด์ฑ๋ง
npm list react # ํน์ ํจํค์ง ๋ฒ์ ํ์ธ
# ์ธ๋ชจ์๋ ํจํค์ง ์ ๋ฆฌ (package.json ์ ์๋ ๊ฒ ์ ๊ฑฐ)
npm prune # ๋ถํ์ ํจํค์ง ์ญ์
npm prune --production # devDependencies ์ญ์ (ํ๋ก๋์
์ด๋ฏธ์ง ์ต์ ํ)
# ํจํค์ง ์ค์น ๊ฒฝ๋ก ๋๋ฒ๊น
npm explain react # react ๊ฐ ์ ์ค์น๋๋์ง (์ด๋ค ํจํค์ง๊ฐ ์๊ตฌํ๋์ง)โ๏ธ .npmrc ๋ก install ๋์ ์ ์ด
.npmrc ํ์ผ์ npm ์ ๋์ ๋ฐฉ์์ ์ธ๋ฐํ๊ฒ ์ ์ดํ๋ค.
# .npmrc (์์๋ค ์ปค๋ฎค๋ํฐ ๊ถ์ฅ ์ค์ )
# ๐ฆ [์์คํ
๋ณดํธ] Node.js ๋ฒ์ ์ด ์ ๋ง์ผ๋ฉด ์์ ์ค์น ๋จ๊ณ์์ ์ฐจ๋จํด๋ผ!
engine-strict=true
# [๋ฒ์ ์๊ฒฉ ๊ด๋ฆฌ] ์ค์นํ ๋ package.json์ ์๋์ผ๋ก ^ ๊ธฐํธ๋ฅผ ๋ถ์ด์ง ๋ง๊ณ , ์ ํํ ๋ฒ์ ๋ง ์ ์ด๋ผ!
save-exact=true
# peerDependencies ์ถฉ๋์ด ๋๋ฉด ๋ฌด์ํ์ง ๋ง๊ณ ์๋ฌ๋ฅผ ๋ณด์ฌ์ค๋ผ! (๊ธฐ๋ณธ๊ฐ)
legacy-peer-deps=false
# ๐ ์ฐ๋ฆฌ ํ ์ ์ฉ ๋ด๋ถ ์ ์ฅ์๊ฐ ์๋ค๋ฉด ์ฌ๊ธฐ์ ์ฐ๊ฒฐํด์ค๋๋ค.
@youngsoo:registry=https://npm.youngsoo.internal.com/๐ฅ
save-exact=true์ ์ํฅ:# save-exact=false (๊ธฐ๋ณธ๊ฐ) npm install react # package.json โ "react": "^18.2.0" # save-exact=true npm install react # package.json โ "react": "18.2.0"
save-exact=true๋ฅผ ์ฐ๋ฉด package.json ์ ์ ํํ ๋ฒ์ ์ด ๊ธฐ๋ก๋๋ค. ์๊ฒฉํ๊ฒ ๋ฒ์ ์ ๊ด๋ฆฌํ๋ ํ์์ ์ฌ์ฉํ๋ค.
๐ ์ด๋ฒ์ ๋ฐฐ์ด ๋ด์ฉ ์ด์ ๋ฆฌ
| ๊ฐ๋ | ํต์ฌ ์์ฝ |
|---|---|
| package-lock.json | ์ ํํ ๋ฒ์ + tarball URL + SHA-512 ํด์ ๊ธฐ๋ก. ๋ฐ๋์ git ์ปค๋ฐ |
| integrity | ๊ณต๊ธ๋ง ๊ณต๊ฒฉ ๋ฐฉ์ด์ . tarball ์๋ณ์กฐ ๊ฐ์ง |
| npm install | package.json ๊ธฐ์ค. lock ๊ฐฑ์ ๊ฐ๋ฅ. ๊ฐ๋ฐ ์ค ์ฌ์ฉ |
| npm ci | lock ํ์ผ ๊ธฐ์ค. lock ๊ฐฑ์ ๋ถ๊ฐ. CI/CD ํ์ |
| ํธ์ด์คํ | ๊ณต์ ๊ฐ๋ฅํ ํจํค์ง๋ฅผ ์ต์์๋ก ์ฌ๋ ค ์ค๋ณต ์ ๊ฑฐ |
| ํฌํ ์์กด์ฑ | ์ง์ ์ค์น ์ ํด๋ ์ธ ์ ์๋ ํจํค์ง. ๊ฐ์ ์์กด์ฑ์ด ๋ฐ๋๋ฉด ๊นจ์ง |
| .npmrc | npm ๋์ ์ธ๋ฐ ์ ์ด. engine-strict, save-exact, ๋ ์ง์คํธ๋ฆฌ ์ค์ |
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. npm ci ์ npm install ์ ๊ฐ์ฅ ์ค์ํ ์ฐจ์ด์ ์?
a) npm ci ๋ ๋ ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด ํญ์ ์ค์น ์๋๊ฐ ๋น ๋ฅด๋ค
b) npm ci ๋ package-lock.json ๊ธฐ์ค์ผ๋ก ์ค์นํ๊ณ lock ํ์ผ์ ๋ณ๊ฒฝํ์ง ์๋๋ค
c) npm ci ๋ devDependencies ๋ฅผ ์๋์ผ๋ก ์ ์ธํ๋ค
d) npm ci ๋ ์ ์ญ ํจํค์ง๋ง ์ค์นํ๋ค
โ
์ ๋ต: b โ package-lock.json ๊ธฐ์ค, lock ๋ณ๊ฒฝ ์ ํจ
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
:
npm ci์ ํต์ฌ์ ์ฌํ ๊ฐ๋ฅ์ฑ์ด๋ค.package-lock.json์ ๊ธฐ๋ก๋ ์ ํํ ๋ฒ์ ๋ง ์ค์นํ๊ณ , lock ํ์ผ์ ์ ๋ ๋ณ๊ฒฝํ์ง ์๋๋ค. lock ํ์ผ์ด ์์ผ๋ฉด ์๋ฌ๋ก ์ข ๋ฃํ๋ค. CI ํ๊ฒฝ์์npm install์ ์ฐ๋ฉดpackage.json์ ๋ฒ์ ๋ฒ์ ๋ด์์ ๊ทธ ์๊ฐ ์ต์ ๋ฒ์ ์ด ์ค์น๋ ์ ์์ด, ์ด์ ํต๊ณผํ๋ ๋น๋๊ฐ ์ค๋ ์คํจํ ์ ์๋ค. - ์ค๋ต ํผ๋๋ฐฑ:
aโnpm ci๋node_modules๋ฅผ ์ญ์ ํ๊ณ ์ฒ์๋ถํฐ ์ค์นํด ์คํ๋ ค ์บ์ ์์ ๋๋ ๋๋ฆด ์ ์๋ค.cโ--omit=dev์ต์ ์ ๋ณ๋๋ก ์จ์ผ ํ๋ค.dโ ์ ์ญ ์ค์น์ ๋ฌด๊ดํ๋ค. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "CI = ๋ณ๊ฒฝ ๊ธ์ง. npm ci = lock ํ์ผ ๋ณ๊ฒฝ ๊ธ์ง."
Q2. ํฌํ ์์กด์ฑ(Phantom Dependency)์ด๋?
a) package.json ์ ์ ์ธ๋์ง๋ง ์ค์ ๋ก ์ฌ์ฉ๋์ง ์๋ ํจํค์ง
b) package.json ์ ์ ์ธํ์ง ์์์ง๋ง ๋ค๋ฅธ ํจํค์ง์ ์์กด์ฑ์ด ํธ์ด์คํ
๋์ด import ๊ฐ ๋์ํ๋ ํจํค์ง
c) node_modules ์ ์กด์ฌํ์ง ์๋ ํจํค์ง
d) ๋ฒ์ ์ด ์๋ชป๋ ํจํค์ง
โ
์ ๋ต: b โ ์ง์ ์ค์น ์ ํ์ง๋ง ํธ์ด์คํ
์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ํจํค์ง
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช
: npm ์ ํ๋ซ ๊ตฌ์กฐ ํธ์ด์คํ
์ผ๋ก ์ธํด
Aํจํค์ง๊ฐ ์์กดํ๋Bํจํค์ง๊ฐ ์ต์์node_modules์ ์ฌ๋ผ์จ๋ค. ๋ด ์ฝ๋์์B๋ฅผ ์ง์ importํ ์ ์์ง๋ง,A๊ฐB๋ฅผ ๋ ์ด์ ์ฌ์ฉํ์ง ์์ผ๋ฉดB๊ฐ ํธ์ด์คํ ๋์ง ์์ ๋ด ์ฝ๋๊ฐ ์๋ฌ๋๋ค. ๋ด๊ฐ ์๋ฌด๊ฒ๋ ๋ฐ๊พธ์ง ์์๋๋ฐ ๋จ์ ์ ๋ฐ์ดํธ๋ก ์ธํด ๋ด ์ฝ๋๊ฐ ๊นจ์ง๋ค. - ํด๊ฒฐ: ์ง์ ์ฌ์ฉํ๋ ํจํค์ง๋
package.json์ ๋ช ์์ ์ผ๋ก ์ ์ธํ๋ค. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๋ด ์ฝ๋์์ ์ฐ๋ ๊ฒ์ ๋ฐ๋์ ๋ด package.json ์ ์์ด์ผ ํ๋ค."
Q3. ๐ฃ ์์ฒ ์ด์ ํ ์คํธ ํ์ โ ๊ธด๊ธ ๋๋ฒ๊น
์์ PM ์ด ์ฌ๋์ ๋ณด๋๋ค. "CI ๋น๋๊ฐ ์ค๋ ๊ฐ์๊ธฐ ์คํจํ์ด์. ์ด์ ๋ ๋๋๋ฐ. ์ฝ๋ ๋ณ๊ฒฝ์ด ์์๋ค๊ณ ์?" ์์ฒ ์ด๊ฐ GitHub Actions ๋ก๊ทธ๋ฅผ ๋ณด๋:
Run npm install
...
added 847 packages in 23s
error TS2339: Property 'createServer' does not exist on type ...
๊ทธ๋ฆฌ๊ณ npm list typescript ๋ก ํ์ธํด๋ณด๋ ์ด์ ๋ 5.2.0 ์ด์๋๋ฐ ์ค๋์ 5.3.0 ์ผ๋ก ์ค์น๋๋ค. ์์ธ๊ณผ ํด๊ฒฐ ๋ฐฉ๋ฒ์?
โ
์ ๋ต: CI ์์ npm install ์ ์ฌ์ฉํด lock ํ์ผ ์์ด ๋งค๋ฒ ์ต์ ๋ฒ์ ์ด ์ค์น๋๋ค. npm ci ๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
# ์์ ์ (๋ฌธ์ ์๋ ์ค์ )
- name: Install dependencies
run: npm install
# ์์ ํ (์ฌ๋ฐ๋ฅธ ์ค์ )
- name: Install dependencies
run: npm ci๐ก ์์ธ ํด์ค:
- ์์ธ:
npm install์package.json์"typescript": "^5.2.0"๋ฒ์ ๋ด์์ ๋งค ์คํ๋ง๋ค ๊ฐ๋ฅํ ์ต์ ๋ฒ์ ์ ์ ํํ๋ค. ์ด์ CI ๊ฐ ๋์์ ๋๋5.2.0์ด ์ต์ ์ด์๊ณ , ์ค๋์5.3.0์ด ๋์์ ๊ทธ๊ฒ ์ค์น๋๋ค. TypeScript ๋ง์ด๋ ๋ฒ์ ์ ๋ฐ์ดํธ์์ ํ์ ์ฒดํฌ๊ฐ ๋ ์๊ฒฉํด์ง ๊ฒ. npm ci๋ฅผ ์จ์ผ ํ๋ ์ด์ :npm ci๋package-lock.json์ ๊ธฐ๋ก๋ ์ ํํ5.2.0๋ง ์ค์นํ๋ค. lock ํ์ผ์5.2.0์ด ๊ธฐ๋ก๋์ด ์๋ ํ, ๋ ์ง์คํธ๋ฆฌ์5.3.0์ด ๋์๋ ๋ฌด์ํ๋ค.- ์ถ๊ฐ ์กฐ์น: ๊ฐ๋ฐํ์ด TypeScript 5.3.0 ์ผ๋ก ์
๊ทธ๋ ์ด๋ํ ์ค๋น๊ฐ ๋์ ๋, ๋ก์ปฌ์์
npm update typescript๋ก lock ํ์ผ์ ๊ฐฑ์ ํ๊ณ ํ์ ์๋ฌ๋ฅผ ์์ ํ ๋ค์ ์ปค๋ฐํ๋ค. - ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "CI ์์๋ npm ci. ํญ์. ์์ธ ์์ด."
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
์ค๋ ๋๋์ด CI ๋น๋ ์คํจ ์์ธ์ ์ก์๋ค. npm install โ npm ci ๋ก ๋ฐ๊ฟจ๋๋ ๊ฑฐ์ง๋ง์ฒ๋ผ ํต๊ณผ๋๋ค. ๊ทธ๋ ๊ฒ ๋จ์ํ ๊ฑฐ์์ด.
package-lock.json ์ด ์ ๊ทธ๋ ๊ฒ ๊ธธ๊ณ ๋ณต์กํ์ง๋ ์ด์ ์ดํดํ๋ค. ๋จ์ํ "๋ฒ์ ๊ธฐ๋ก" ์ด ์๋๋ผ tarball URL ๊ณผ SHA-512 ํด์๊ฐ๊น์ง ์ ์ด์ ํ์ผ ์๋ณ์กฐ๋ฅผ ๋ง๋ ๊ฑฐ์๋ค. integrity ํ๋๊ฐ ๊ณต๊ธ๋ง ๊ณต๊ฒฉ์ ๋ฐฉ์ด์ ์ด๋ผ๋, ๊ทธ๋ฅ ์๋ ์์ฑ๋๋ ํ์ผ์ธ ์ค๋ง ์์๋๋ฐ.
๐ก ์ค๋์ ๊ตํ: "CI ์์๋ npm ci. ๋ก์ปฌ์์๋ npm install. ์ด ๋ ์ค๋ง ๊ธฐ์ตํ๋ฉด '๋ด ๋ก์ปฌ์์๋ ๋๋๋ฐ' ์ง์ฅ์์ ํ์ถํ ์ ์๋ค."
ํฌํ ์์กด์ฑ ์ด์ผ๊ธฐ๋ ์ ์ ํ๋ค. ๋ด๊ฐ ์ค์น ์ ํ ๊ฑธ import ํด์ ์ธ ์ ์๋ค๋ ๊ฒ... ์ง๊ธ๊น์ง ๋ชฐ๋์ผ๋ฉด ์ธ์ ๊ฐ ์ฌ๊ณ ๊ฐ ๋ฌ์ ๊ฒ ๊ฐ๋ค. ์์ผ๋ก๋ import ํ๋ ๊ฑด ๋ฌด์กฐ๊ฑด package.json ์ ๋ช ์ํ๋ ์ต๊ด์ ๋ค์ฌ์ผ๊ฒ ๋ค.
์ค๋์ ํด๊ทผํ๋ฉด์ ์ด๋ ๊ฐ๋ค ์๋ค. ๋ด์ผ์ scripts ๋ ๋ผ์ดํ์ฌ์ดํด ํ ํ๋ณผ ์์ . ์๊ฐ๋ณด๋ค npm ์ ๋ฐฐ์ธ ๊ฒ ์ด๋ ๊ฒ ๋ง๋ค๋, ์ฒ์์ ๊ทธ๋ฅ install ์น๋ฉด ๋๋ ์ค ์์๋๋ฐ.