npm semver - 틸트 범위(~)와 캐럿 범위(^)

slaslaya·2020년 4월 3일
10
"devDependencies": {
	"pimatic-meross": "^0.1.1",
	"react-test-renderer": "^16.13.0",
	"react-zeroconfig": "^3.27.2-alpha.2"
}

드디어 package.json에서 많이 보았던 캐럿 ^ 까지 왔다.

고급 범위 지정 2

Tilde Ranges(~)


minor version이 지정되어 있다면 patch level 변경을 허용한다.
그렇지 않은 경우 minor-level 변경을 허용한다.

  • ~1.2.3
    minor version이 지정되어 있으니 patch level 변경 허용
    >=1.2.0 <1.(2+1).0
    >=1.2.0 <1.3.9

  • ~1.2
    minor version이 지정되어 있으니 patch level 변경 허용 (1.2.x와 같다)
    >=1.2.0 <1.(2+1).0
    >=1.2.0 <1.3.0

  • ~1
    minor version이 지정되어 있지 않기 때문에 minor-level 변경을 허용
    >=1.0.0 <(1+1).0.0
    >=1.0.0 <2.0.0

  • ~3.10.0-alpha.1
    minor version이 지정되어 있으니 patch level 변경 허용
    3.10.0 이 일치하는 prerelease tag도 함께 포함된다.

    >=3.10.0-alpha.1 <3.(10+1).0

    >=3.10.0-alpha.1 <3.11.0
    3.10.0-alpha.2는 포함이 되지만, 3.11.0-alpha.2는 포함되지 않는다.

Caret Ranges(^)


Caret Range 만의 특징이 있다.

[major, minor, patch]에서 가장 왼쪽에 있는 0이 아닌 요소를 수정하지 않는 변경 허용
1.0.0 버전이라면 minor와 patch 버전을 업데이트를 허용
0.X 버전이라면 patch 업데이트 허용
0.X.X 버전이라면 업데이트를 허용하지 않는다.

Many authors treat a 0.x version as if the x were the major "breaking-change" indicator. Caret ranges are ideal when an author may make breaking changes between 0.2.4 and 0.3.0 releases, which is a common practice. However, it presumes that there will not be breaking changes between 0.2.4 and 0.2.5. It allows for changes that are presumed to be additive (but non-breaking), according to commonly observed practices.
(https://github.com/npm/node-semver#caret-ranges-123-025-004)

많은 저자들이 0.x 버전에서 x가 “호환성이 손상되는 변경”의 지표로 생각한다.
Caret ranges는 예를 들어 저자가 0.2.4 버전과 0.3.0 버전 사이에 호환성이 손상되는 변경(breaking-change) 업데이트 했을 시의 상황에 사용하는 것이 가장 이상적이다. 실로 이러한 경우는 일상다반사로 일어난다.
그러나 이는 0.2.4 버전과 0.2.5 버전 사이에 호환성이 손상되는 변경이 없을 것이라고 간주한다.
주로 관찰되는 관행에 따르면, 이는 추가적인 (그러나 호환성이 손상되는 변경) 변화로 간주되는 변화를 허용한다는 것이다.
(@oywI)

Breaking change는 호환성이 깨지는 변경이 있다는 의미한다.
보통 Breaking change를 포함한 업데이트를 major로 올리는데, 경우에 따라서는 Breaking change 없이 major를 올리기도 하고, 그냥 프로젝트 관리하는 사람 성향에 따라 Breaking change 없으면 무조건 minor만 올리는 사람도 있고, Breaking change가 없어도 major를 올리는 사람도 있다. Open Source 프로젝트들 들어가서 CHANGELOG.md 파일들을 보면 이해가 될 것이다. (@iamssen)

예시로 확인해 보자

  • ^1.2.3
    왼쪽에서 맨 처음 0이 아닌 요소는 major 이기 때문에 minor, patch 업데이트를 허용
    >=1.2.3 < 2.0.0

  • ^0.2.3
    왼쪽에서 맨 처음 0이 아닌 요소가 minor 이기 때문에 patch 업데이트를 허용
    >=0.2.3 <0.3.0

  • ^0.0.3
    왼쪽에서 맨 처음 0이 아닌 요소가 patch이기 때문에 업데이트를 허용하지 않음

  • ^1.2.3-beta.2
    왼쪽에서 맨 처음 0이 아닌 요소가 major 이기 때문에 minor, patch 업데이트를 허용하고
    1.2.3 version 일치하는 경우 prerelease tag도 함께 포함된다.
    >=1.2.3-beta.2 <2.0.0

  • ^0.0.3-beta
    0.0.3의 prerelease만 허용된다. 0.0.3-pr.2는 허용이 된다.

patch 값이 누락되어 있는 경우

0으로 표기하지만, major와 minor version 둘 다 0인 경우 해당 값 내에서 유연성이 허용된다.

  • ^1.2.x
    0이 아닌 맨 처음 요소가 major이고 0으로 채워진다.
    >=1.2.0 <2.0.0

  • ^0.0.x
    major와 minor 둘 다 0 이기 때문에 해당값 내에서 유연성 허용
    >=0.0.0 <0.1.0

  • ^0.0
    major와 minor 둘 다 0 이기 때문에 해당값 내에서 유연성 허용
    >=0.0.0 <0.1.0

결론

이제 pakage.json의 파일을 이해할 수 있게 되었다.

"devDependencies": {
  "pimatic-meross": "^0.1.1",
  "react-test-renderer": "^16.13.0",
  "react-zeroconfig": "^3.27.2-alpha.2"
}

하나씩 톺아보면

"pimatic-meross": "^0.1.1",

^(Caret Ranges) 를 사용하였고 0이 아닌 첫번째 version은 수정하지 않기 때문에 patch만 변경된다.
또한 아직 1.0.0이 릴리즈 된게 아니기 때문에 0.1와 0.2가 호환성이 손상되는 변경(breaking-change) 일 수 있다.
0(0.y.z)은 초기 개발을 위해서 쓴다. 아무 때나 마음대로 바꿀 수 있 수도 있다. 는것을 명심하쟈 (https://semver.org/lang/ko/#spec-item-4)

"react-test-renderer": "^16.13.0",

0이 아닌 첫번째 자리가 major 이기 때문에 >=16.13.0 <17.0.0 까지 업데이트 될 수 있다.

"react-zeroconfig": "^3.27.2-alpha.2"

0이 아닌 첫번째 자리가 major 이기 때문에 major는 업데이트 하지 않는다.
prerelease tag가 붙어있기 때문에 [3.27.2] 버전은 prerelease version도 함께 업데이트 된다. (3.27.2-alpha.3은 업데이트에 포함되지만 3.27.3-alpha.2은 업데이트에 포함될 수 없다.)
>=3.27.2-alpha.2 <4.0.0

TIP npm semver calculator

설명과 예시를 봐도 헷갈릴 때🙄는 npm semver calculator https://semver.npmjs.com/ 추천한다.
한 눈에 확인 할 수 있으며 prerelease version이 있는 react-zeroconfig로 확인하는걸 추천

Links와 이해에 도움주신 분들..따흑
https://github.com/npm/node-semver#readme
https://blog.outsider.ne.kr/1041
https://github.com/imhojang
https://github.com/iamssen

profile
안녕하새요

2개의 댓글

comment-user-thumbnail
2021년 7월 9일

좋은 글 잘 봤습니다 ~!

답글 달기
comment-user-thumbnail
2021년 12월 7일

Tilde Ranges(~)의 ~1.2.3은 >= 1.2.0 < 1.3.0 아닌가요?
< 1.3.9를 허용하면 Minor Version의 변경을 허용하게 되는 것 같아요.

답글 달기