Velog는 항상 보기만 했지, 글을 써보는 건 처음입니다. 글솜씨가 많이 서툴더라도 귀엽게 봐주세요..
틀린 내용이 있다면 피드백이나 지적해주시면 정말 너무 감사하겠습니다.😁
npm을 사용하면서 정말 지겹게도 많이 봤던 package.json과 package-lock.json...
두 파일들을 어떤 모듈이 어떤 버전으로 깔렸는지 명시되어있는 일종의 표..?
정도로만 생각했던 저는 의문이 안 들 수가 없었습니다.
두 파일은 도대체 뭐가 어떻게 다른걸까???
그래서 이 글을 통해서 package-lock.json이라는 파일들에 대해서 좀 더 자세히 알아보려고 합니다.
본 글에서는 package.json이 어떤 파일인지는 다루지 않았습니다. 이 점 주의바랍니다.
모든 파일에는 파일마다의 역할이 있습니다.
당연하게도 package.json
파일이 제 역할을 다 한다면, package-lock.json
은 만들어질 이유가 없습니다.
그렇다면 이
package-lock.json
은 왜 만들어질까?
package.json
에서는 버전정보를 저장할 때 version range
를 사용합니다.
e.g.) "express": "~4.16.1"
version range란❓
🙋🏻♂️ : "내가 사용할 패키지의 버전은4.16.1
버전이야" 라고 말하는 대신
🙋🏻♂️ : "나는4.16.1
버전 이상, 그리고4.17.0
미만의 패키지를 사용할거야" 라고 말하는 방식을 뜻해요.
물론 전자처럼 버전정보를 명시하는 것도 가능합니다.
협업을 하기위해 우리는 같은 package.json
을 사용해서 각자의 컴퓨터에 같은 패키지들을 설치해서 같은 개발환경을 구성하게 됩니다.
하지만 불행하게 이러한 일들이 일어날 수 있습니다.
👨🏻💻 : "코드가 돌아가질 않네...뭐가 문제지..."
👩🏻💻 : "내 컴퓨터에서는 잘만 돌아가는데..?"
👨🏻💻 : "하... 뭐가 문제지...."
몇 시간 뒤....
👨🏻💻 : "모듈에 문제가 있는 거 같아.. 나는4.16.1
인데, 너는 버전 몇이야?"
👩🏻💻 : "4.16.2
"
👨🏻💻 :
시간은 금인데 이런 하찮은 버전 문제때문에 몇 시간씩 버리다니...
물론 위와 같은 상황도 해결할 수는 있습니다.
1. 팀원끼리 사전에
npm --version
명령어를 통해 npm 버전이 일치하는지 확인
2. 이미 잘 못 깔아버린node modules
삭제
3. npm cache 삭제
4.npm install
명령어로 다시 dependencies를 설치
음...꽤나 길지 않나요...?
개발자들은 항상 모든 일에 효율을 극한으로 따집니다.
이렇게 귀찮은 행동들을 개발자들이 그냥 넘어갈 리가 없죠.
그래서 태어난 것이 바로 이 package-lock.json
입니다.
package-lock.json
파일을 살펴보시면, package.json
에는 틸드(~)로 명시되어있는 모듈들이 package-lock.json
에는 버전명이 정확히 명시되어 있습니다.
정확한 버전의 패키지를 다운받기 위함같네요.
이렇게 package-lock.json
이 왜 생겨났는지는 알게되었습니다.
하지만 아직 의문점이 남아있는데요.
그렇다면 이
package-lock.json
은 언제 만들어질까?
npm 공식문서에 따르면, package-lock.json
은 npm이 node_modules
트리 또는 package.json
이 수정될 때, 자동으로 생성이 된다고 나와있습니다.
한 마디로 npm install
로 어떠한 모듈을 install하였을 때, package.json
과 함께 생성된다고 보면 되겠네요.
하지만 여기서 주목해야할 부분이 있습니다.
바로 package-lock.json
이 존재할 때에는 npm install
의 동작방식이 조금 변한다는 점인데요.
package.json
을 사용하여 node_modules
를 생성하지않고 package-lock.json
을 사용하여 node_modules
를 생성합니다.
더 정확한 버전의 패키지를 내려받기 위함 같네요.
package-lock.json
은package.json
으로는 부족한 정보를 도와주는 파일이다.
따라서 생성된package-lock.json
파일은 소스 저장소에 함께 커밋하자!
이건데... 여기서 제 궁금증은 모두 해결되지 않았습니다.
애초에 package.json에 정확한 버전명을 적어놓으면 안되는거야?
너무 맞는 말이죠. package.json에 정확한 버전명을 명시해두면, 패키지도 정확히 다운받아질텐데... 뭐가 문제지?
만약 package.json
에 패키지 버전명을 정확히 명시하게 된다면, 프로젝트에서 사용하고 있는 패키지의 중요한 버그 수정이 이루어질 때 마다 프로젝트의 package.json
에 적혀있는 버전도 수정을 해야하기 때문입니다.
모든 크고 작은 패키지들의 릴리즈에 대해 항상 추적하고 수정해야하는 엄청난 귀찮음과 수고스러움을 version range
로 명시함으로써, 이를 해결해주는 것이었죠.
출처
package-lock.json 파일에 대해서 알아보면서, 이렇게나 많은 글들이 있을 줄은 몰랐습니다.
제 글에 도움을 주셔서 감사합니다.🙇🏻♂️
이상으로 포스팅을 마칩니다. 긴 글 읽어주셔서 감사하고,
다시 한번 말씀드리지만, 피드백은 언제나 환영입니다.😚
궁금해하면서도 직접 찾아보지는 않던 사실이네요... 잘 배워갑니다!