yarn.lock 파일(잠금파일)은 무엇이고 어떤 기능을 하는가?

오늘 할 이야기는 yarn.lock이 무엇이고 어떤 일을 하는지 알아보도록 하겠습니다.

package.json 패키지 관리

들어가기에 앞서 패키지 관리는 package.json을 통해서 패키지 버전 관리를 합니다. java 진영에서 maven, gradle과 비슷하다고 생각하면 됩니다.

npm install 명령어를 하게 되면 package.json에 포함된 의존성 패키지들이 npm registry로부터 다운받아져 설치가 되고 node_modules 폴더에 저장이 됩니다.

lock파일은 왜 필요한가?

여기서에서 모든 개발자가 동일한 package.json을 바라보고 있기 때문에, 패키지를 설치하면 모두가 동일한 버전의 패키지를 설치하지 않을까요?

NO!!!! (그렇지 않습니다.)

왜냐하면, package.json에 명시한 버전들이 틸드(~), 캐럿(^)으로 인해서 버전의 범위가 달라지기 때문입니다.

틸드, 캐럿에 따른 버전의 범위에 관련된 글은 아래에서 확인 가능합니다. https://umanking.github.io/2022/05/05/npm-version-tilde-caret/

예를 들어보면 package.json의 react패키지를 "react": "^16.8.2" 라고 설정했을때 캐럿의 범위는 16.8.2 이상 17.0.0 미만의 최신 버전을 적용합니다.

즉, 최초 패키지를 인스톨했을때 16.8.2버젼으로 설치되고, 다른개발자가 입사해서 그 다음 버전이 나왔을때 설치를 했다면 16.9.0이 되고, 그 다음 다른 개발자가 또 입사해서 설치했다면 (16.10.0 버전이 나온상태), 16.10.0으로 설치가 됩니다.

결국, 요약하자면 하나의 package.json 파일로 버전을 관리하는데, 패키지 명시하는 캐럿,틸드에 의해서 버전 범위가 존재하게 되고, 특정 시점에 가장 최신 버전으로 설치되는것이 문제입니다.

lock 파일의 필요성

그래서 lock 파일을 만들어서, 최초의 프로젝트 initializing 했을때의 해당 버전으로 고정해버립니다(lock 잠금). 그리고 원격 저장소에 푸시를 합니다. lock 파일은 .gitignore 에 포함되어 있으면 안됩니다. 반드시 포함을 시켜서 git에서 팀원간의 공유할 수 있도록 remote에 올려야 합니다.

그러면 나머지 개발자는 package.json 과 lock파일(yarn.lock 또는 package-lock.json) 을 PULL 받아서 패키지를 설치할때, 최신 버전이 아니라 lock파일에 정의되어있는 해당 버전으로 설치를 진행하게 됩니다.

결국 lock 파일을 통해서 모든 개발자는 동일하게 버전을 사용할 수 있습니다.

Ref