package.json의 틸드(~)와 캐럿(^)

Yuri Lee·2022년 3월 9일
0

Intro

package.json 가 무엇이고, 틸드와 캐럿에 대해 알아보자!

package.json

package.json은 프로젝트의 정보를 정의하고, 의존하는 패키지 버전 정보를 명시하는 파일이다.

틸드(~)

npm을 사용할 때 package.json에서 버전 명시를 다음과 같이 할 수 있다.

  • 1.2.3
  • >1.2.3
  • >=1.2.3
  • <1.2.3
  • <=1.2.3
  • ~1.2.3

틸드는 간단히 말하면 현재 지정한 버전의 마지막 자리 내의 범위에서만 자동으로 업데이트한다.

  • ~0.0.1 : >=0.0.1 <0.1.0
  • ~0.1.1 : >=0.1.1 <0.2.0
  • ~0.1 : >=0.1.0 <0.2.0
  • ~0 : >=0.0 <1.0

캐럿(^)

캐럿을 설명하기 전에 먼저 Semantic Versioning(보통 SemVer라고 부른다.)를 설명해야 하는데 Node.js도 그렇고 npm의 모듈은 모두 SemVer를 따르고 있다. SemVer는 MAJOR.MINOR.PATCH의 버저닝을 따르는데 각 의미는 다음과 같다.

  1. MAJOR version when you make incompatible API changes,
  2. MINOR version when you add functionality in a backwards-compatible manner, and
  3. PATCH version when you make backwards-compatible bug fixes.

즉, MAJOR 버전은 API의 호환성이 깨질만한 변경사항을 의미하고 MINOR 버전은 하위호환성을 지키면서 기능이 추가된 것을 의미하고 PATCH 버전은 하위호환성을 지키는 범위내에서 버그가 수정된 것을 의미한다.

캐럿(^)은 Node.js 모듈이 이 SemVer의 규약을 따른다는 것을 신뢰한다는 가정하에서 동작한다. 그래서 MINOR나 PATCH버전은 하위호환성이 보장되어야 하므로 업데이트를 한다.

  • ^1.0.2 : >=1.0.2 <2.0
  • ^1.0 : >=1.0.0 <2.0
  • ^1 : >=1.0.0 <2.0

그래서 캐럿을 사용했을 때는 위와 같이 동작한다. 틸드와 비교해 보면 차이점은 명확한데 1.x.x내에서는 하위호환성이 보장되므로 그 내에서는 모두 업데이트하겠다는 의미이다.

하지만 여기에 예외사항이 있다. 다음 내용을 보자.

  • ^0.1.2 : >=0.1.2 <0.2.0
  • ^0.1 : >=0.1.0 <0.2.0
  • ^0 : >=0.0.0 <1.0.0
  • ^0.0.1 : ==0.0.1

버전이 1.0.0 미만인 경우(SemVer에서는 pre-release라고 부른다.)에는 상황이 다르다. 소프트웨어 대부분에서 1.0버전을 내놓기 전에는 API 변경이 수시로 일어난다. 그래서 0.1을 쓰다가 0.2를 사용하면 API가 모두 달라졌을 수 있다. 그래서 캐럿(^)을 사용할 때 0.x.x에서는 마치 틸드처럼 동작해서 지정한 버전 자릿수 내에서만 업데이트한다.(앞에 예시와 비교해보면 차이점을 알 수 있다.) 그리고 0.0.x인 경우에는 하위호환성 유지가 안 될 가능성이 더 높으므로 위의 마지막 예시처럼 지정한 버전만을 사용한다.


https://velog.io/@skyepodium/package.json
https://blog.outsider.ne.kr/1041

profile
Step by step goes a long way ✨

0개의 댓글