작성배경
master 브랜치에서 npm i
로 노드 모듈을 새로 다운받은 후 새로이 브랜치를 따서 작업을 마무리하고 커밋을 하려고 하는데 package-lock.json 파일안의 resloved 의 주소가 모두 기존의 https 에서 http 로 변경된 것을 확인했다. 우선 이해 대해 구글링 한 결과 명확한 원인을 찾기는 힘들었고, 해결책만 찾아낼 수 있었다. 이 해결책을 블로그에 올려야겠다는 생각과 함께, 더 근본적으로 이 package-lock.json 이 무슨 일을 하는 녀석인지 공부겸 정리하면 좋을 것 같아 포스팅을 한다.
위와 같은 상황에서 해결책
- 팀원끼리 node/npm 버전이 일치하는지 확인:
node -v
andnpm -v
(optional) - node modules 삭제:
rm -rf node_modules/
- npm 캐시 삭제:
npm cache clean --force
package-lock.json
파일 변경 사항 원상복귀- 다시 dependencies 설치:
npm i
위 일련의 방법들이 다소 강제적일 수도 있지만, 중요한 것은 내가 직면한 문제를 해결해 주었다.
package-lock.json 이란?
package-lock.json
은 npm을 사용하여package.json
파일을 또는 node_modules
트리를 수정하면 자동으로 생성되는 파일이다. 한마디로 파일이 생성되는 시점의 의존성 트리에 대한 정보를 가지고 있다. 그렇다면 package-lock.json
파일이 꼭 필요한 이유는 무엇인지 아래에서 더 살펴보자. package.json
파일의 의존성 선언에는 version range
가 사용되는데, 이는 특정 버전이 아니라 버전의 범위를 의미한다. 예를들어 보자면, npm i express
를 실행하게 되면 package.json
파일에는 “^4.16.3”(Caret Ranges)로 버전 범위가 추가된다. 이 package.json
를 기반으로 npm i
을 실행하면 현재는 4.16.3 버전이 설치 되지만 새로이express
의 마이너 패치가 이루어진 버전이 퍼블리시 되어있다면 동일한package.json
파일로 npm i
을 실행해도 4.16.4, 이나 4.17.1 같은 다른 버전이 설치될 수 있는 것이다. 간혹 업데이트된 버전이 오류를 발생시키는 경우가 있기 때문에 안정성을 위해package-lock.json
은 매우 중요하다.
맺으며
package-lock.json
파일은 의존성 트리에 대한 정보를 가지고 있으며, 작성된 시점의 의존성 트리가 다시 생성될 수 있도록 보장해준다.package-lock.json
파일은 저장소에 꼭 같이 커밋해야 한다.package-lock.json
파일은node_modules
없이 배포하는 경우 반드시 필요하다.
새해복 많이 받으세요!
[참고자료] https://hyunjun19.github.io/2018/03/23/package-lock-why-need/