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

package.json 패키지 관리

패키지 관리는 package.json을 통해서 버전 관리를 한다. java에서 maven, gradle이라고 생각하면 된다.

package.json에 명시되어있는 모든 패키지가 npm 또는 yarn 명령어를 통해서 실행하게 되면 npm registry로부터 다운받아져서 node_modules 폴더에 저장이 된다.

lock파일은 왜 필요한가?

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

NO!!!! (그렇지 않다)

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

틸드, 캐럿에 따른 버전의 범위에 관련된 글은 아래에서 확인 가능하다.

https://umanking.github.io/2022/05/05/npm-version-tilde-caret/

예를 들어보면 pacakge.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 파일을 만들어서, 최초의 프로젝트 initializing 했을때의 해당 버전으로 고정해버린다(lock 잠금). 그리고 원격 저장소에 푸시를 한다. .gitignore 에 포함되어 있으면 안된다.

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

모든 개발자는 동일하게 버전을 사용할 수 있다. 물론, 배포시에 CI/CD에서도 해당 lock파일을 바라보고, 설치하기 때문에 로컬, 다른 모든 개발자의 로컬, 원격지 서버 모두 동일한 환경이다.

Ref

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

npm package.json의 verison과 틸드tilde(~)와 캐럿caret(^)

Newer post

vscode debugging 셋팅 방법

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