Vue 3.0/03.SFC와 Vite

[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 파일을 이용해서 라이브러리를 설치하기 때문에 모든 개발자가 동일한 버전을 사용할 수 있게 된다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.