[vite] package.json vs package-lock.json
이번 포스트에서는 package.json이랑 비슷한거 같은데 매번 따라다니는 package-lock.json 파일에 대해서 살펴보자.
package-lock.json
범위를 이용한 버전관리?
이전 포스트에서 package.json에서는 라이브러리의 버전을 범위로 지정한다고 이야기 했었다.
https://goodteacher.tistory.com/550
[vuecli]package.json의 버전 표시
이번 포스트에서는 package.json에서 사용되는 library의 버전 표시 방법에 대해서 살펴보자. package.json의 library 버전 표시 semantic versioning(semver) 먼저 package.json에서 사용되는 버전의 체계에 대해..
goodteacher.tistory.com
즉 A:^1.2.3 이라고 설정해 두었다면 A에 대해서 1.2.4가 설치될 수도 있고 1.3이 설치될 수도 있다.
그럼 이 과정에서 몇 가지 이상한 점이 발생할 수 있다.
- 실제로 설치되는 버전은 몇 버전일까?
- 내 동료와 나는 같은 버전을 사용할 수 있을까?
즉 package.json에서 의존성의 버전에 대해 범위로 지정해버리는 바람에 유동적인 상황이 발생하고 뭔가 고정할 필요가 있는 것이다.
package-lock.json을 통한 버전 lock
그래서 버전 정보를 lock 해서 고정할 필요가 있다. 의존성 library의 버전이 package.json에서는 범위로 지정되는 반면 package-lock.json에는 특정 버전으로 명시된다.
예를 들어 필자의 package.json 파일을 보면 bootstrap의 버전이 다음과 같이 명시되어있다.
"bootstrap": "^4.5.3",
따라서 하위 호환성이 유지되는 4.5.3<=Version<5.0.0이 라이브러리의 설치가 가능하다. 도대체 어떤 버전이 설치될 것인가? package-lock.json에 가보면 아래와 같은 실제 설치 정보가 있다.
"node_modules/bootstrap": {
"version": "4.6.1",
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.1.tgz",
. . .
"peerDependencies": {
"jquery": "1.9.1 - 3",
"popper.js": "^1.16.1"
}
},
즉 정확히 설치된 버전은 4.6.1 버전인 것이다.
협업과 package-lock.json
그럼 A와 B 두 개발자가 협업으로 개발을 진행할 때 package.json 파일만 공유하면 어떤 문제가 생길까?
A가 package.json을 만들고 npm install을 수행하면 npm은 그 당시의 의존성에 대한 버전 정보를 확인해서 package-lock.json을 만들고 library를 설치한다. 그런데 만약 package.json만을 git에 등록했다고 생각해보자.
1년 후 B가 프로젝트에 합류 했고 이제 사용하려는 의존성의 버전이 올라가버렸다면 아마도 하위 호환성이 유지되는 새로운 라이브러리를 B는 설치할 것이고 A에게서 충돌이 발생할 것이다.
따라서 B에게 필요한 것은 package.json 뿐 아니라 package-lock.json도 필요하다. package-lock.json이 존재하면 npm은 package.json이 아닌 package-lock.json 파일을 이용해서 라이브러리를 설치하기 때문에 모든 개발자가 동일한 버전을 사용할 수 있게 된다.