패키지 잠금이란?
2023년 09월 12일프로젝트에서 npm을 이용해 패키지를 설치하다보면 처음에는 없었던 package-lock.json
이 생성된다. package.json
에 패키지 정보가 있으니까 필요없는 거 아냐?라고 생각할 수 있지만 package-lock.json
은 중요한 역할을 한다.
package-lock.json 역할
package-lock.json
파일은 왜 필요할까?
한마디로 하자면 ‘정확한 버전을 기록해서 같은 프로젝트를 구동하는 여러 환경에서 동일한 버전의 패키지를 사용하기 위함’ 이라고 할 수 있다.
package.json의 한계
package.json
파일에는 종종 패키지의 버전에 ^
~
가 붙어 패키지의 한개의 버전이 아닌 버전 범위가 기록된다.
예를 들어 npm i axios
라는 명령어로 axios
패키지를 설치하면, package.json 파일에 이렇게 기록된다.
"dependencies": {
"axios": "^1.2.4"
}
^1.2.4
: 1.2.4이상 2.0 버전 미만이라는 의미이기 때문에, 이후에 axios의 새로운 버전이 나오고, 그 상태에서 package.json
을 기준으로 설치하다 보면 1.6.0 1.7.0 등 다른 버전이 설치될 수 있다.
개발자A, 개발자B가 같은 package.json
파일을 기준으로 설치하더라도 시간차에 따라 서로 다른 버전의 패키지를 설치할 수 있게 되는 것이다. 마찬가지로 개발 환경, 운영 환경에서 서로 다른 버전으로 설치될 수 있다.
같은 프로젝트가 다른 환경에서 다른 버전의 패키지가 설치되면 버전에 따라 되던 기능이 안될 수도 있고, 같은 코드임에도 한 환경에서 잘 실행되던 코드가 다른 환경에서는 실행이 안되기도 한다. 디버깅할 때도 힘들겠지 (이마짚)
package-lock.json 자세히 알아보기
npm i axios@1.2.4
로 1.2.4 버전을 설치해보자.
npm ls
명령어로 설치된 패키지의 버전을 확인해보면 이렇게 나온다.
└── axios@1.2.4
case1 : package-lock.json이 없을 때
- 패키지가 저장된 node_modules 폴더, package-lock.json 을 각각 삭제한 후
npm i
로 패키지를 설치해보자npm ls
명령어로 설치된 패키지의 버전을 확인해보면└── axios@1.5.0
- → 처음과 다르게 1.5.0 버전이 설치되었다.
case2 : package-lock.json이 있을 때
- (case1 이전 상태로 만들기 위해
npm rm axios
한 후에 다시 예제의 처음처럼npm i axios@1.2.4
로 1.2.4 버전을 설치 - 패키지가 저장된 node_modules 폴더를 삭제한 후
npm i
로 패키지를 설치해보자npm ls
명령어로 설치된 패키지의 버전을 확인해보면└── axios@1.2.4
- → 처음과 동일한 1.2.4 버전이 설치되었다.
package-lock.json
은 설치되는 시점의 버전을 고정하고 그 내용을 저장한다. 이렇게
...
"node_modules/axios": {
"version": "1.2.4",
...
},
package-lock.json을 빼먹으면 안돼
그렇기에 공동으로 작업하는 경우 package-lock.json
파일도 공동으로 작업하는 사람들과 공유해야한다. 처음 프로젝트를 시작하는 사람이 package-lock.json
파일을 포함된 채로 프로젝트를 공유하는 것이 좋다. 또한 중간에 패키지를 추가, 제거한 경우에도 반드시 package-lock.json
을 같이 커밋해야한다.
관련글
-
npm 패키지 버전별 설치, 삭제 명령어 정리
TAGS
NPM
NODE.JS