λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ‘¨‍πŸ’» web.dev/node

[NPM] package-lock.json 은 λ¬΄μ—‡μΌκΉŒ?

by HandHand 2022. 6. 18.

πŸ“Œ package.json 의 ν•œκ³„μ 

npm 을 μ΄μš©ν•΄μ„œ ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄ package.json 을 톡해

ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ—μ„œ μ‚¬μš©ν•˜λŠ” μ™ΈλΆ€ νŒ¨ν‚€μ§€ μ˜μ‘΄μ„±μ„ κ΄€λ¦¬ν•˜κ²Œλ©λ‹ˆλ‹€.

 

λ‹€μŒμ€ package.json μ˜ˆμ‹œμž…λ‹ˆλ‹€.

{
  "name": "package json example",
  "version": "1.0.0",
  "description": "example",
  "main": "index.js",
  "scripts": {
    "start": "webpack serve --mode development",
    "build": "webpack --mode production",
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "react": "^17.0.2",
    "react-dom": "^17.0.2",
    "typescript": "^4.5.5"
  },
  "devDependencies": {
    "@babel/core": "^7.17.8",
    "@babel/polyfill": "^7.12.1",
    "@babel/preset-env": "^7.16.11",
    "@babel/preset-react": "^7.16.7",
    "@babel/preset-typescript": "^7.16.7",
    "@types/react": "^17.0.42",
    "@types/react-dom": "^17.0.14",
    "babel-loader": "^8.2.4",
    "clean-webpack-plugin": "^4.0.0",
    "css-loader": "^6.7.1",
    "file-loader": "^6.2.0",
    "html-webpack-plugin": "^5.5.0",
    "style-loader": "^3.3.1",
    "webpack": "^5.70.0",
    "webpack-cli": "^4.9.2",
    "webpack-dev-server": "^4.7.4"
  }
}

ν˜Όμžμ„œ ν”„λ‘œμ νŠΈλ₯Ό 진행할 κ²½μš°μ—λŠ” μƒκ΄€μ—†μ§€λ§Œ 규λͺ¨κ°€ 큰 ν”„λ‘œμ νŠΈμ˜ 경우

λ‹€μˆ˜μ˜ κ°œλ°œμžλ“€μ΄ κ°œλ°œμ— ν•¨κ»˜ μ°Έμ—¬ν•˜κ²Œλ˜κ³  λͺ¨λ“  κ°œλ°œμžλ“€μ΄ λ™μΌν•œ 개발 ν™˜κ²½μ„ κ°€μ§€λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€.

그런데 package.json 에 λͺ…μ‹œν•˜λŠ” 버전정보 ν‘œκΈ°λ²•μ΄ λ•Œλ‘œλŠ” λ¬Έμ œκ°€ 될 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

πŸ’‘ semver ν‘œκΈ°λ²•

package.json 은 semver ν‘œκΈ°λ²•μœΌλ‘œ νŒ¨ν‚€μ§€ 버전정보λ₯Ό λͺ…μ‹œν•©λ‹ˆλ‹€.

semver λŠ” λ²”μœ„ 지정 λ°©μ‹μœΌλ‘œ ^ λ‚˜ ~ λ₯Ό 톡해 버전정보λ₯Ό λͺ…μ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μžμ„Έν•œ λ‚΄μš©μ€ 유의적 버전 2.0.0 λ¬Έμ„œλ₯Ό 톡해 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

⚠️ λ¬Έμ œκ°€ 될 수 μžˆλŠ” 상황

package.json 만 μ‘΄μž¬ν•˜λŠ” ν”„λ‘œμ νŠΈκ°€ μ €μž₯μ†Œμ— μ‘΄μž¬ν•œλ‹€κ³  κ°€μ •ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

  1. μ‹ μž…κ°œλ°œμž Jessica 이 ν”„λ‘œμ νŠΈλ₯Ό clone ν•΄μ˜΅λ‹ˆλ‹€.
  2. ν”„λ‘œμ νŠΈλ₯Ό μ—΄κ³  npm install 을 μ΄μš©ν•΄ 의쑴 νŒ¨ν‚€μ§€λ₯Ό μ„€μΉ˜ν•©λ‹ˆλ‹€.
  3. 이번 μŠ€ν”„λ¦°νŠΈμ— κ°œλ°œν•  κΈ°λŠ₯인 μ‚¬μ§„μ—μ„œ μ˜μ—­ λ³΅μ‚¬ν•˜κΈ° λ₯Ό μΆ”κ°€ν•˜κ³  μ €μž₯μ†Œμ— push ν•©λ‹ˆλ‹€.
  4. ν•¨κ»˜ μΌν•˜λŠ” 개발자 Owen 이 μ €μž₯μ†Œμ—μ„œ μ½”λ“œλ₯Ό pull ν•˜κ³  λΉŒλ“œλ₯Ό ν•΄λ³΄λ‹ˆ.. μ—λŸ¬κ°€ λ°œμƒν•©λ‹ˆλ‹€ πŸ˜₯

 

πŸš€ package-lock.json 의 λ“±μž₯

μ΄λŸ¬ν•œ 문제 상황을 λ°©μ§€ν•˜κΈ° μœ„ν•΄μ„œ npm version 5 λΆ€ν„°λŠ” package-lock.json 파일둜

μ‚¬μš©ν•˜κ³  μžˆλŠ” λͺ¨λ“  νŒ¨ν‚€μ§€λ“€μ˜ μ •ν™•ν•œ 버전정보 λ₯Ό μΆ”μ ν•©λ‹ˆλ‹€.

이λ₯Ό ν†΅ν•΄μ„œ 단 ν•˜λ‚˜μ˜ μ˜μ‘΄μ„± 트리λ₯Ό λ§Œλ“€ 수 있고 λ™μΌν•œ package.json κ³Ό package-lock.json 을

μ΄μš©ν•˜λŠ” λͺ¨λ“  κ°œλ°œμžλ“€μ΄ λ™μΌν•œ λ²„μ „μ˜ νŒ¨ν‚€μ§€λ₯Ό 기반으둜 개발이 κ°€λŠ₯ν•΄μ§‘λ‹ˆλ‹€.

 

πŸ“Œ package-lock.json 의 ꡬ쑰

{
  "name": "tna-partners-web",
  "version": "0.0.1",
  "lockfileVersion": 2,
  "requires": true,
    "packages": {
        // ...
    },
    "dependencies": {
        // ...
    }
}

1️⃣ name

package-lock.json 에 ν•΄λ‹Ήν•˜λŠ” ν”„λ‘œμ νŠΈμ˜ νŒ¨ν‚€μ§€ 이름이며 package.json κ³Ό μΌμΉ˜ν•©λ‹ˆλ‹€.

2️⃣ version

package-lock.json 에 ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ˜ 버전정보이며 package.json κ³Ό μΌμΉ˜ν•©λ‹ˆλ‹€.

3️⃣ lockfileVersion

package-lock.json 이 생성될 λ•Œ ν•΄λ‹Ή νŒŒμΌμ— λΆ€μ—¬λ˜λŠ” 1 μ΄μƒμ˜ λ²„μ „μ •λ³΄μž…λ‹ˆλ‹€.

1 은 npm v5 와 v6 μ—μ„œ μ‚¬μš©λ˜κ³  2 λŠ” 1 κ³Ό ν•˜μœ„ν˜Έν™˜λ˜λ©° npm v7 μ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

3 은 μˆ¨κ²¨μ§„ lockfile 인 node_modules/.package-lock.json 에 μ‚¬μš©λ˜λ©°

npm v6 에 λŒ€ν•œ ν•˜μœ„ν˜Έν™˜μ΄ ν•„μš”μ—†μ–΄μ§€λ©΄ npm μ—μ„œ μ‚¬μš©λ  μ˜ˆμ •μž…λ‹ˆλ‹€.

4️⃣ requires

npm 5.1.0 이후에 μΆ”κ°€λœ ν•„λ“œμ΄λ©° ν”„λ‘œμ νŠΈμ— ν•„μš”ν•œ νŒ¨ν‚€μ§€λ“€μ„ μΆ”μ ν•˜λ„λ‘ μ„€μ •ν•©λ‹ˆλ‹€.

5️⃣ packages

ν”„λ‘œμ νŠΈκ°€ μ‚¬μš©ν•˜λŠ” νŒ¨ν‚€μ§€λ“€μ˜ 메타 정보듀을 담은 κ°μ²΄μž…λ‹ˆλ‹€.

version , resolved , link λ“± λ‹€μ–‘ν•œ 속성듀이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

6️⃣ dependencies

lockfileVersion: 1 을 μ‚¬μš©ν•˜λŠ” μ˜ˆμ „ 버전 npm 지원을 μœ„ν•œ λ ˆκ±°μ‹œ λ°μ΄ν„°μž…λ‹ˆλ‹€.

npm v7 μ—μ„œ packages ν•„λ“œκ°€ μ •μ˜λ˜μ–΄μžˆμœΌλ©΄ 이 ν•„λ“œλ₯Ό λ¬΄μ‹œν•©λ‹ˆλ‹€.

 

πŸ“Œ package-lock.json 은 κΌ­ repository 에 올리자!

μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ“―μ΄ package.json 만 μ‚¬μš©ν•˜λ©΄ ν•΄λ‹Ή ν”„λ‘œμ νŠΈμ˜ κ°œλ°œμžλ“€ μ‚¬μ΄μ—μ„œ

각 νŒ¨ν‚€μ§€λ“€μ˜ 버전정보가 μΌμΉ˜ν•˜μ§€ μ•ŠλŠ” λ¬Έμ œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

λ”°λΌμ„œ ν”„λ‘œμ νŠΈλ₯Ό github 와 같은 μ €μž₯μ†Œμ— 올릴 λ•Œ

λ°˜λ“œμ‹œ κΉŒλ¨Ήμ§€λ§κ³  package-lock.json 도 ν•¨κ»˜ push ν•΄μ€μ‹œλ‹€ πŸ˜„

 

πŸ“Œ μ°Έκ³  자료

The package-lock.json file

Be aware of the package-lock.json and npm install

NPM5, What is the difference of package-lock.json with package.json?

λ°˜μ‘ν˜•

πŸ’¬ λŒ“κΈ€