package-lock.json 에 관하여

한영재
3 min readJan 3, 2019

작성배경

master 브랜치에서 npm i로 노드 모듈을 새로 다운받은 후 새로이 브랜치를 따서 작업을 마무리하고 커밋을 하려고 하는데 package-lock.json 파일안의 resloved 의 주소가 모두 기존의 https 에서 http 로 변경된 것을 확인했다. 우선 이해 대해 구글링 한 결과 명확한 원인을 찾기는 힘들었고, 해결책만 찾아낼 수 있었다. 이 해결책을 블로그에 올려야겠다는 생각과 함께, 더 근본적으로 이 package-lock.json 이 무슨 일을 하는 녀석인지 공부겸 정리하면 좋을 것 같아 포스팅을 한다.

위와 같은 상황에서 해결책

  1. 팀원끼리 node/npm 버전이 일치하는지 확인: node -v and npm -v (optional)
  2. node modules 삭제: rm -rf node_modules/
  3. npm 캐시 삭제: npm cache clean --force
  4. package-lock.json 파일 변경 사항 원상복귀
  5. 다시 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은 매우 중요하다.

맺으며

  1. package-lock.json 파일은 의존성 트리에 대한 정보를 가지고 있으며, 작성된 시점의 의존성 트리가 다시 생성될 수 있도록 보장해준다.
  2. package-lock.json 파일은 저장소에 꼭 같이 커밋해야 한다.
  3. package-lock.json 파일은 node_modules 없이 배포하는 경우 반드시 필요하다.

새해복 많이 받으세요!

[참고자료] https://hyunjun19.github.io/2018/03/23/package-lock-why-need/

--

--