npm
패키지들의 버전은 package.json
파일에서 dependencies
나 devDependencies
프로퍼티 하위의 객체로 관리되고 있습니다. 이 패키지들의 버전 표현 방식과 특정 버전을 설치할 수 있는 방법을 알아보겠습니다.
💻 Semantic Version Convention
npm
패키지의 버전은 semver (semantic versioner for npm)
의 컨벤션을 따르며 아래와 같이 표현됩니다.
[Major].[Minor].[Patch]
Major
이전 버전과 호환되지않는 큰 변경사항이 반영된 업데이트일 경우 해당 부분의 숫자가 증가하게 됩니다.
Minor
이전 버전과 호환되는 가정하에, 새로운 기능이 추가되는 업데이트일 경우 해당 부분의 숫자가 증가하게 됩니다.
Patch
기존의 버그를 수정하기 위한 업데이트일 경우에 해당 부분의 숫자가 증가하며, 이전 버전과 호환됩니다.
💻 Hyphen Ranges
X.Y.Z - A.B.C
위 표기처럼 나타내며 >= X.Y.Z <= A.B.C
를 의미합니다. 아래의 예시는 npm SemVer Calculator에서 1.2.1 - 3.4.0
범위의 lodash
버전을 조회한 결과입니다.
표시한 것 처럼 1.2.1
과 3.4.0
버전을 포함하고 있는것을 알 수 있습니다.
만약 앞의 버전중 일부분만 주어졌을 경우는 생략된 부분은 0으로 대체됩니다. 즉 X.Y - A.B.C
는 >= X.Y.0 <= A.B.C
와 같습니다. 아래의 예시는 1.3 - 3.4.0
범위의 lodash
버전을 조회한 결과로 1.3.0
, 3.4.0
버전이 포함된것을 볼 수 있습니다.
두번째 버전중 일부분만 주어졌을 경우, 주어진 버전으로 시작하는 모든 버전이 허용되지만 그 보다 큰 버전은 허용되지 않습니다. 예를들어, 1.2.3 - 2.3
범위가 주어졌다면 2.3
으로 시작하는 모든 버전을 허용되지만 2.4
는 허용되지 않습니다. 이를 부등호로 표시해보면 >= 1.2.3 < 2.4
로 나타낼 수 있습니다. 또한 1.2.3 - 2
는 >= 1.2.3 < 3
과 같습니다.
아래 예시는 1.3.1 - 3.3
범위의 lodash
버전을 조회한 결과 입니다. 3.4
이후 버전은 조회되지 않았음을 알 수 있습니다.
💻 X-Ranges
A.B.x
,A.X
,A.B.*
,*
위와 같은 표기법을 의미합니다. X
, x
, *
중 하나를 사용하여 [Major].[Minor].[Patch]
의 숫자중 하나를 표현할 수 있습니다.
*
,""
>= 0.0.0
와 같으며 모든 버전을 의미합니다.A.x
,A
>= A.0.0 <(A+1).0.0
와 같으며 주어진Major
버전이 일치하는 모든 버전을 의미합니다. 다음 예시는3.x
로 조회한lodash
의 버전들입니다.3
버전과 일치하는 모든 버전이 조회되었으나4
이후의 버전은 조회되지 않았음을 알 수 있습니다.(>= 3.0.0 < 4.0.0)
A.B.x
,A.B
>= A.B.0 < A.(B+1).0
를 의미하며, 주어진Major
,Minor
버전과 일치하는 모든 버전을 의미합니다. 아래는4.16.x
로 조회한lodash
의 버전입니다.
💻 Tilde Ranges
~A.B.C
위와 같은 표기법을 의미합니다. Minor
버전이 지정되었으면 Patch
버전 변경이 허용되며, 그렇지 않으면 Minor
버전 변경이 허용되는 표기법입니다. 예시는 다음과 같습니다.
~1.2.3
Minor
버전이 지정되었으므로 주어진Major
,Minor
버전을 만족하는 모든 버전을 의미합니다(Patch
버전만 변경). 즉>= 1.2.3 < 1.(2+1).0
과 같습니다.~1.2
>= 1.2.0 < 1.(2+1).0
를 의미하며, 이는1.2.x
와 같습니다.~1
Minor
버전이 지정되지 않았으므로,Major
버전을 만족하는 모든 버전을 의미합니다(Minor
,Patch
버전만 변경). 즉>= 1.0.0 < (1+1).0.0
과 같으며1.x
로 표현할 수도 있습니다.~0.2.3
>= 0.2.3 < 0.(2+1).0
와 같습니다.~0.2
>= 0.2.0 < 0.(2+1).0
과 같으며0.2.x
로 표현할 수도 있습니다.~0
>= 0.0.0 < (0+1).0.0
을 의미하며,0.x
로 표현할 수도 있습니다.~1.2.3-beta.2
>= 1.2.3-beta.2 < 1.(2+1).0
을 의미합니다. 한가지 주의할 점은prerelease
버전은[Major].[Minor].[Patch]
체계와 다르기 때문에1.2.4-beta.2
버전이 있다고 하더라도 위 범위에는 포함되지 않습니다.
💻 Caret Ranges
^A.B.C
위와 같은 표기법을 의미합니다. 가장 왼쪽의 0이 아닌 숫자(left-most non-zero digit)를 업데이트하지 않는 변경을 허용하는 표기법입니다.
^1.2.3
Major
버전이 가장 왼쪽의 0이 아닌 숫자이기 때문에,Minor
,Patch
버전의 변경만 허용됩니다. 따라서>= 1.2.3 < (1+1).0.0
으로 표현할 수 있습니다.^0.2.3
Minor
버전이 가장 왼쪽의 0이 아닌 숫자이기 때문에,Patch
버전의 변경만 허용됩니다. 따라서>= 0.2.3 < 0.(2+1).0
으로 표현할 수 있습니다.^0.0.3
Patch
버전이 가장 왼쪽의 0이 아닌 숫자이기 때문에, 현재의 버전만 해당됩니다.>= 0.0.3 < 0.0.(3+1)
로 표현할 수 있습니다.
만약 버전 중 생략된 부분이 있다면 0으로 생략된 부분을 대치해 생각하면 됩니다.
^1.2.x
^1.2.0
으로 바꿔 생각할 수 있기때문에>= 1.2.0 < (1+1).0.0
과 같습니다.^0.0.x
,^0.0
Major
,Minor
가 모두 0이므로 해당값내에서 유연성을 허용합니다. 따라서>= 0.0.0 < 0.1.0
으로 표현할 수 있습니다.^1.x
^1.0.0
와 같으므로>= 1.0.0 < (1+1).0.0
와 같습니다.^0.x
Major
가 0이므로 역시 해당값내에서 유연성이 허용되며>= 0.0.0 < 1.0.0
로 표현할 수 있습니다.