node.js

[Node] package.json.lock 파일의 역할

판교너굴맨 2023. 2. 5. 02:30

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

 

package.json | npm Docs

Specifics of npm's package.json handling

docs.npmjs.com