본문 바로가기
웹(web)

버전관리(SemVer)에서 틸드(~)와 캐럿(^)

by 바코94 2022. 1. 4.

npm package.json 에서 패키지의 버전을 관리하다 보면 ~1.0.1 이나 ^12.1.2 과 같은 것을 볼 수 있다. 
여기서 틸드(~)와 캐럿(^) 에 대해서 살펴보자.

틸드와 캐럿을 사용하기 전에 1.1.3 과 같이 썼을 때 각 자리가 어떤 것을 의미하는지 짚고 넘어가자. npm 에서는 버전관리시에 SemVer 방식을 사용한다.
https://semver.org/
Semantic version이라고 불리는 버전 방식을 기준으로 다음과 같이 해석된다.

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.

참고 : Additional labels for pre-release and build metadata are available as extensions to the MAJOR.MINOR.PATCH format.
즉, SemVer을 따른다면 메이저 버전이 바뀌면 api 호환이 안되는 것이고, 마이너 버전은 호환이 되고 기능의 추가가 생긴 것이고, 패치버전은 버그 수정이 된 것이다. 1.1.3 에서 1.1.5 와 같이 패치버전이 바뀌었다면 마이너 버전이 바뀌지 않았으니 호환은 당연히 되고 버그 수정이 되었다고 볼 수 있다. 

 

- 틸드(~)를 사용하면 다음과 같이 버전범위를 가리키게 된다.

  • ~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

 

- 캐럿(^)을 사용하면 다음과 같다. 마이너버전과 패치버전이 올라가도 SemVer에서는 호환이 되는 것으로 간주하기 때문에 캐럿(^)을 쓰더라도 호환성에는 문제가 없다고 볼 수 있다.

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


캐럿을 사용할 때 메이저버전이 0이라면(ex. ^0.1.2) 조금 다르게 동작한다. 그 이유는 SemVer에서 메이저버전이 0인 것은 pre-release로 간주하는데, 이때는 변경이 수시로 일어나기 때문에 조금 다르게 처리된다. 정식 배포 이전에 버전이 바뀌다 보면 마이너 버전, 패치 버전의 변경 조차도 api 호환에 문제가 생길 수 있다고 생각하면 이해가 쉽다. 

  • ^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                  -> 업데이트 안함



실제로 내가 사용하는 버전이 어디에 해당하는지 확인하는 기능도 있어서 헷갈릴 때는 직접 넣어서 확인해볼 수 있다 (https://semver.npmjs.com/)

참고

https://docs.npmjs.com/cli/v6/using-npm/semver

 

semver | npm Docs

The semantic versioner for npm

docs.npmjs.com