역시 사람은 직접 겪어봐야 뼈저리게 느낀다는게 정말 맞는말이다.
pm ci npm install의 차이점, package-lock.json과 package.json의 차이점을 모르는것은 아니었다. 호되게 당해보니 그 차이점이 와닿고 기억에 오래오래 남는것 같다.
하지만 그럼에도 이런 이론적인 공부가 중요한 이유는 어떤 문제를 해결할때 이론적인 부분이 작은 실마리를 제공하기 때문이라고 생각한다.
회사에서 자체적으로 개발한 라이브러리인데 npm repository에서 다운을 못받는 문제가 있었다.
왜 다운을 못받는지는 그만 알아보도록 하자...
pacakge 코드는 있는데 npm repository에서 package 다운을 못받는 상황이라서 어떻게 할지 해결법을 찾아보다가 급한대로 코드를 .tgz파일로 만들어서 .tgz 파일을 설치하는 방법을 찾아냈다.
매번 npm install 어쩌구만 사용했지 이렇게 파일 형태로 설치를 해 본것은 처음이었다.
설명을 위해 cra로 프로젝트를 하나 생성했다.

그리고 아무런 js 파일 하나를 만들어서 package 형태로 만들어보겠다.
//index.js
export const hi = () => {
console.log("hi");
};
npm init을 해 package.json 파일을 생성하고 npm pack으로 .tgz 파일을 만들었다.


생성된 .tgz파일을 아까 생성했던 프로젝트에 넣는다.

npm install hi-package-1.0.0.tgz을 입력해 생성한 package를 설치한다.
설치하면 package.json과 package-lock.json에 내용이 추가된다.
package.json

package-lock.json

package-lock.json은 정확한 버전을 표시하기 때문에 관리가 잘 되어야한다고만 알고있었지 어떤 내용이 추가되는지는 처음 봤다.
추가된 내용에는 integrity라는 항목이 있다.
아까 hi.js 파일을 packaging할때 잘 보면 integrity라는 부분이 있었다.
lock.json의 integrity 항목과 npm pack할때 나왔던 integrity 항목의 값을 비교해보면 똑같은 값임을 알 수 있다.
단어 그대로 이 항목은 이 package의 무결성을 검증하는데 사용된다.
만약 네트워크가 해킹되어서 이상한 package를 다운받아 설치하게 된다면 어떻게 될까?
아까 생성한 hi 패키지로 무결성 검사를 테스트해보자.
hi 패키지의 내용을 변경하고 다시 packaging해준다.

새로 만든 .tgz 파일을 프로젝트 root에 넣어준다.

npm ci를 하면 아래와 같은 error가 뜬다


잘 읽어보면 integrity 검사에서 실패했다는 내용이 있다.
nodejs package들은 모두 integrity 값이 있다.
package.json은 사용되는 package들의 목록과 버전 범위를 명시하지만
package-lock.json은 현재 프로젝트에서 사용하고 있는 정확한 버전과 그 버전의 integrity 같은 정보도 기록한다.
그래서 package-lock.json만 있다면 여러 사람이 같은 환경을 구축하고 협업할 수 있어서 잘 관리되어야하는 파일이다.
무결성 검사 테스트 할때 아무리 package를 다시 만든후 npm ci를 해도 무결성 검사가 성공하는 문제가 있어서 내가 잘못 이해한건가 싶었다.
문득 드는 생각이 테스트용으로 만든 파일이 너무 작아서(진짜인지는 모름) .tgz 파일을 바꾸어도 같은 package로 인식되어서 npm의 cache에 등록된 최초 버전 파일이 npm ci에 사용되는건가하는 생각이 들었다.
혹시나 하는 마음에 npm cache clean --force를 실행하고 다시 pm ci를 했더니 드디어 verify integrity fail 에러를 만날 수 있었다..!
오오..!! 블로그 활용의 모범이네요! 개발하면서 겪은 경험과 알게 된 것들을 기록하고, 다른 사람들과 공유하며 자신도 참고할 수 있도록 말이죠! 저도 꾸준히 이런 경험들을 기록해 나가야 하는데 생각만큼 잘 안하게 되더라구요 ㅜ
npm install 하면 integrity는 자동으로 생성되는 거였군요. 전에는 integrity를 직접 생성해서 lock 파일에 붙여 넣었던거 같았는데, 그건 npm install 없이 lock파일에 직접 설치 정보를 넣기 위해서였다.는 것으로 글을 읽고 기억이 다시 정리되는 것 같아요!
이 글은 같은 경험을 공유하고 있는 저에게도 많은 도움이 되네여! 제 블로그에도 참고용으로 사용해도 될까요? 제 기억도 상기되는 멋진 포스트 이네요!