package.json.lock 파일을 .gitignore 설정하고 진행 중이던 프로젝트에 최근 문제가 생겼다.
그 과정에서 package-lock.json 파일에 대해 좀 더 알아보는 시간이 될 수 있었다.
1. package.json란?
현재 프로젝트에 대한 이름, 버전 등의 정보와 패키지 매니저로 설치한 모듈의 의존성을 관리하는 파일이다.
npm공식문서: https://docs.npmjs.com/cli/v9/configuring-npm/package-json
package.json
2. package-lock.json란?
package-lock.json is automatically generated for any operations where npm modifies either the node_modules tree, or
package.json. It describes the exact tree that was generated, such that subsequent installs are able to generate identical trees, regardless of intermediate dependency updates.
직역하면,
package-lock.json은 npm이 node_lock 트리 또는 package.json을 수정하는 모든 작업에 대해 자동으로 생성된다. 생성된 정확한 트리를 설명하므로, 후속 설치에서 중간 종속성 업데이트에 관계없이 동일한 트리를 생성할 수 있습니다.
즉,
package-lock.json은 생성되는 시점에 설치한 모듈들의 정확한 의존성 트리를 가지고 있고, 나중에 투입된 개발자도 동일한 node_modules 트리를 생성할 수 있다.
package-lock.json
3. why package-lock.json?
package.json도 package-lock.json도 버전을 관리하고 있는데 굳이 package-lock.json을 써야 할까?
package.json의 의존성이 있는 모듈 버전을 보면 ^표시를 볼 수 있다.
"buefy": "^0.9.15"
// ^0.9.15: = >=0.9.15 <1.0.0-0
npm-package.json-dependenceis: https://docs.npmjs.com/cli/v9/configuring-npm/package-json#dependencies
위와 같이 package.json의 모듈 version은 range(범위)로 관리 된다.
만약 lock 파일 없이 package.json 파일로만 패키지를 install 했을 때, buefy 버전이 0.9.15에서 0.9.22버전으로 업데이트 되었다면 처음 install한 개발자의 node_module / buefy 버전은 0.9.15이고, 후속으로 install한 개발자의 node_moduole / buefy버전은0.9.22로 설치가 된다
package-lock 파일을 보면 캐럿(^) 표시가 없다. 정확한 의존성 트리를 가지고 있다.
lock 파일이 있는 경우에는 나중에 install 받을 개발자도 node_module에 buefy가 0.9.15 버전으로 install 받을 수 있게 된다.
package-lock.json 없이 package.json으로만 모듈을 install 하면 아래 시나리오와 같은 상황이 벌어질 수 있다.
* package.json.lock을 gitignore 에 넣음
최근 투입 된 개발자: A
1년전 투입 된 개발자: B
A: 컴포넌트를 개발 해서 올렸습니다!
B: pull 받았는데 컴포넌트가 깨지네요??
A: node_modules/buefy 라이브러리 버전이 0.9.22 입니다.
B: 저는 0.9.15 버전인데요??
A, B: 띠용??
결론: package-lock.json 파일은 깃에 올리는게 좋다.
참고
npm package.json
https://docs.npmjs.com/cli/v9/configuring-npm/package-json#dependencies
'node.js' 카테고리의 다른 글
[Node] Mac OS에서 NVM 설치하기 (0) | 2023.01.28 |
---|---|
[node.js] nodejs로 크롤링(crawling) 시작하기 (2) | 2022.10.11 |
[node.js] 객체지향 프로그래밍이란? (Typescript) (0) | 2022.08.09 |
[node.js] nvm으로 프로젝트별 node version 관리하기 (0) | 2022.07.07 |
[node.js] package.json script 실행 파일 명령어 설정 ( --global ) (0) | 2022.06.24 |