npm install시 자동으로 생기는 package-lock.json이 대체 무슨 역할인지 알아보자.
package.json은 이 프로젝트 패키지의 정보들을 담고 있다.
이름, 버전 등을 포함하고 있는데, 의존성 모듈 정보도 가지고 있다.
{
"name": "myApp",
...
"dependencies": {
"express": "^4.16.4",
...
}
}
dependencies에는 이 패키지 실행에 필요한 다른 모듈들의 이름과 버전 정보가 명시되어 있다.
그래서 다른 사람이 내 코드를 다운받아 실행하더라도, npm install만 실행하면 내가 설치했던 의존 모듈들이 함께 설치된다.
하지만, 여기엔 문제가 몇가지 있다.
첫번째 문제는, 명시된 모듈이 다른 버전으로 설치될 수 있다는 것이다.
dependencies에 명시된 버전은 주로 범위로 표기된다. 예를들어 ^4.16.4라면 새 배포버전이 나온 경우 새 버전이 설치되어 내가 설치한 버전과 다른 사람이 설치했을때(또는 배포환경에서)의 모듈은 버전이 달라질 수 있다.
만약 이 버전의 차이가 파괴적인 변경이 있었다면, 심각한 에러가 발생할 수도 있다.
두번째 문제는, 명시된 모듈의 하위 종속 모듈이 다른 버전으로 설치될 수 있다.
몇 버전 이상이 아니라 정확히 어떤 버전을 설치하라고 명시하면 해결되지 않을까? 라고 생각했지만 그게 아니었다.
일반적으로 하나의 패키지를 설치하면 하위의 다른 패키지들도 같이 설치된다.
+ express@4.16.2
added 12 packages in 5.24s
하위 패키지들에 대해서도 첫번째 문제와 같은 문제가 발생한다. 따라서 내 프로젝트의 package.json파일에 범위가 아니라 하나의 버전을 명시하더라도, 언제나 같은 버전의 모듈들이 설치되지 않을 수 있다.
이를 해결하기 위해 package-lock.json이 필요하다.
package-lock.json은 해당 패키지에 현재 설치되어 있는 모든 모듈들의 버전들이 트리 구조로 명시되어 있다.
따라서 package-lock.json의 버전을 관리한다면, 모든 환경에서 같은 버전의 모듈 구성을 사용할 수 있다.
사용중인 패키지들의 모든 하위 모듈을 파악할 수는 없으므로, 파괴적인 변화가 있는 새 버전이 출시되어도 안정성을 유지하기 위해 package-lock.json의 버전관리는 꼭 필요한 것 같다.
'Web development > Node.js & Typescript' 카테고리의 다른 글
[Sequelize] there is no unique constraint matching given keys for referenced table 원인과 해결방법 (0) | 2020.06.23 |
---|---|
[Typescript] Jest 모킹시 빨간줄 뜨는 문제 (Property 'mock' does not exist on type) (0) | 2020.06.02 |
[Javascript] 이벤트루프와 호출 스택(call stack), 비동기성 (0) | 2020.04.03 |
[Javascript] for, setTimeout 퀴즈 (0) | 2020.03.31 |
[Javascript] map vs filter vs reduce (0) | 2020.02.11 |
댓글