npm semver - Version Range, Prerelease Tags

slaslaya·2020년 4월 3일
2

Node에서는 Version Range를 권장한다?

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

^ 와 -alpha.2 을 확인할 수 있는데, Node에서는 특히 이같은 Version Range를 권장하며 Prerelease Tags가 있냐, major가 0이냐 에 따라 달라진다.

Strict constraint (or fully qualified constraint) are those constraints matching only one version. In most case it is a bad idea to use them.Why? Because with them you are locking your dependency to a specific patch release which means you won't ever get bug fixes when updating your dependencies.
(https://jubianchi.github.io/semver-check/#/)

엄격한 제약조건은 오직 한 버전과 매칭하여 특정 patch release에 의존하는 것이기 때문에 버그가 수정되지 않는 문제가 있다.

그렇기 때문에 적절하게 version range를 설정해야 한다.

범위

내가 어느버전까지 올릴지 범위를 정할 수 있다.

  • < 명시된 버전보다 낮은버전
  • <= 명시된 버전과 같거나 낮은버전
  • > 명시된 버전보다 높은버전
  • >= 명시된 버전보다 같거나 높은버전

whitespace를 사용할 수 있는데 and와 같다고 볼 수 있다. 또한 ||(or)도 같이 쓰일 수 있다.

예시로 확인하쟈

  • >=1.2.7 <1.3.0
    [major, minor, patch]로 본다면 이 예시는 patch 업데이트만 허용한다.

  • 1.2.7 || >=1.2.9 <2.0.0
    1.2.7 이거나 1.2.9포함 minor과 patch 업데이트 허용

Prerelease Tags

알아야 하는 개념이 또 있다. 정식이 아닌 버전을 pre-release version을 나타내는 Prerelease tag이다.

정식 배포를 앞둔 pre-release version은 PATCH Version 바로 뒤에 붙임표(-)와 마침표(.)로 구분된 식별자를 더해서 표시할 수 있다.
예) 1.0.0-alpha, 1.0.0-alpha.1, 1.0.0-0.3.7, 1.0.0-x.7.z.92.
https://semver.org/lang/ko/

이제 예시를 보자
> 1.2.3-alpha.3

[major, minor, patch] 전부 일치할 경우 1.2.3일 경우 prerelease tag도 함께 포함된다. 1.2.3-alpha.4는 포함, 1.2.4도 포함 되지만 1.2.4-alpha.3은 포함되지 않는다.

이렇게 되어있는 건 2가지 이유가 있다.

  1. prerelease version은 매우 빠르게 업데이트 되기 때문에, public consumption에는 적합하지 않고 많은 변경사항이 포함되어 있기 때문에 range matching에는 제외된다.
  2. user가 prerelease version을 사용하기로 했다면 위험을 인식하고 있다고 볼 수 있기 때문에 [major, minor, patch]가 일치 하는 경우에는 포함하지만, 다음 prelease version까지는 감수하기로 했다고 할 수 없기 때문에 포함하지 않는다.

🤭와우

고급 범위 지정

Advanced Range Syntax

  • ~ 사용하는 Hyphen Ranges X.Y.Z - A.B.C
  • x 를 사용하는 X-Ranges 1.2.x 1.X 1.2.*
  • ~를 사용하는 Tilde Ranges ~1.2.3 ~1.2 ~1
  • ^를 사용하는 Caret Ranges ^1.2.3 ^0.2.5 ^0.0.4

4가지로 구성

예시로 하나씩 알아보쟈

Hyphen Ranges X.Y.Z - A.B.C

  • 1.2.3 - 2.3.4
    >=1.2.3 <=2.3.4
    1.2.3과 같거나 커야하며 2.3.4보다 같거나 작어야 한다.

  • 1.2 - 2.3.4
    첫번째 버전에 생략이 있다면 0을 포함시킨다.
    >=1.2.0 <=2.3.4

  • 1.2.3 - 2.3
    두번째 버전에 생략이 있다면 [major, minor] 가 일치하는 경우만 포함
    >=1.2.3 <2.4

  • 1.2.3 - 2
    두번째 버전에 생략이 있다면 2로 시작하는 [major] 가 일치하는 경우만 포함
    >=1.2.3 <3

X-Ranges

  • *
    >0.0.0 모든 버전에 충족
  • 1.x
    marjor와 minor level의 업데이트 허용 >=1.0.0 <2.0.0

  • 1.2.x
    patch level의 업데이트 허용 >=1.2.0 <1.3.0

고급 범위 구문에서 가장 얘기가 많이 나오는 캐럿(^)과 틸트(~)는 다음편에서..

참고 Links
https://semver.org/lang/ko/
https://github.com/npm/node-semver#readme
https://developer.okta.com/blog/2019/12/16/semantic-versioning
https://poiemaweb.com/nodejs-npm#24-semantic-versioning%EC%9C%A0%EC%9D%98%EC%A0%81-%EB%B2%84%EC%A0%84

profile
안녕하새요

1개의 댓글

comment-user-thumbnail
2021년 12월 7일

Hyphen Ranges는 -를 사용하는 것 맞나요?
~ 사용하는 Hyphen Ranges X.Y.Z - A.B.C
요 부분이 이상해보여요.

답글 달기