package.json에서 물결표 (~)와 캐럿 (^)의 차이점은 무엇입니까?


3383

나는 안정적인 최신으로 업그레이드 한 후 node그리고 npm, 나는 시도했다 npm install moment --save. package.json캐럿 ^접두사를 사용 하여 항목을 저장합니다 . 이전에는 물결표 ~접두사였습니다.

  1. 왜 이러한 변경이 이루어 npm집니까?
  2. 물결표 ~와 캐럿 의 차이점은 무엇입니까 ^?
  3. 다른 사람보다 장점이 무엇입니까?

42
참고로 다음을 수행하여 접두사를 방지하거나 사용자 지정 접두사를 사용할 수 있습니다 npm config set save-prefix=''.. ( ~당신이 선호하는 경우 따옴표를 붙입니다.) 나는 개인적 으로이 작업을 수행하고 생산 작업을 축소합니다.
fncomp

19
물결표와 캐럿의 작동 방식과 차이점에 대한 모든 세부 사항 : github.com/npm/node-semver#tilde-ranges-123-12-1
Jeffrey Martinez

11
이 도구는 테스트 할 수있는 좋은 도우미입니다 semver.npmjs.com
chaiyachaiya

@fncomp는 의견이 올 바르면 명확하게 설명하고 싶었습니다. 프로젝트에서 특정 버전의 종속성 만 사용합니까? 우리 팀은 의존성 업그레이드를 주저합니다. 의존성에 특정 버전이나 '~'접두사를 사용하는 것이 좋습니다 ..?
blogs4t

@fncomp "개인적으로이 작업을 수행하고 프로덕션 환경을 축소합니다"라고 말하여 의미하는 바를 자세히 설명해 주시겠습니까? 감사!
blogs4t

답변:


3842

참고 항목 NPM의 문서semver 문서를

~ version“대략 버전과 동일”, 부 버전을 늘리지 않고 향후 모든 패치 버전으로 업데이트합니다. ~1.2.31.2.3에서 <1.3.0까지의 릴리스를 사용합니다.

^ 버전“호환 가능”은 주 버전을 증가시키지 않고 향후 모든 부 / 패치 버전으로 업데이트합니다. ^2.3.42.3.4에서 <3.0.0까지의 릴리스를 사용합니다.

아래의 주석을 참조하십시오.


325
잘 생각하지 않는 사람들을 잡기 위해 여기에 게시하면 ^와 ~ 둘 다 종속성에서 마이너 및 포인트 릴리스를 신뢰할 수 있다고 가정합니다. 도서관을 출판하고 있고 다른 사람들이 당신을 믿기를 원하는 경우, 다운 스트림 영역을 눈에 띄게 받아들이지 마십시오. 당신의 의존성에서 나쁜 점이 나오면 연쇄 반응이 일어날 수 있으며, 사람들이 배 모양이 될 때 문을 두드리는 사람들이 생길 것입니다. 이것이 프로덕션 코드에서 npm shrinkwrap을 사용해야하는 또 다른 큰 이유입니다.
tehfoo

8
또한 a ^또는 a로 버전 앞에 붙는 npm의 모든 넌센스를 제거 할 수 있습니다 ~. 버전을 엄격하게 제어하려면 다음을 설정하십시오. npm config set save-prefix=''
kumarharsh

5
@prasanthv가 맞습니다 : from docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : 캐럿 범위 ^ 1.2.3 ^ 0.2.5 ^ 0.0 .4. [major, minor, patch] 튜플에서 0이 아닌 왼쪽 숫자를 수정하지 않는 변경을 허용합니다. 즉, 버전 1.0.0 이상의 패치 및 부 업데이트, 버전 0.X> = 0.1.0의 패치 업데이트 및 버전 0.0.X의 업데이트는 허용되지 않습니다.
rofrol

15
사용할 때 semver에 @jgillich 0.2.x, 2하지 않은 것입니다 major version. 그래서 docs.npmjs.com에서 다음과 같은 특정 단어를 사용했습니다 the left-most non-zero digit. 이 사건에 대해 또 무엇을 : ^ 0.0.4 수단 0.0.4
rofrol

11
@FagnerBrack : 제공 한 구체적인 예는 정확하지만 일반적으로 생각하는 방식이 잘못되었습니다. 예 :하자 년대는 패키지가 있다고 가정 해 A3 개 버전 : 0.0.1, 0.0.20.0.3. 버그가 0.0.1있으므로 최소한 0.0.2패키지에 넣고 싶습니다 B. 당신이 쓰면 0.0.x괜찮을 것 0.0.3입니다. 다른 패키지는하지만 C모두 필요 B하고 A제한 한 추가하고 "A": "<0.0.2"당신은 얻을 것이다 0.0.1당신이 원하는 아닌 임의의 충돌 문제를 표시하지 않고. 물결표 ~0.0.2를 사용하면 이 문제를 피할 수 있습니다.
Maciej Sz

861

질문에 언급 된 방법을 포함하여 버전 특이성에 대한 모든 방법을 설명하는 공식 npmjs 설명서를 추가하고 싶습니다.

https://docs.npmjs.com/files/package.json

https://docs.npmjs.com/misc/semver#x-ranges-12x-1x-12-

  • ~version"버전과 대략 동일" npm semver 참조 -Tilde Ranges & semver (7)
  • ^version"버전과 호환" npm semver 참조 -Caret Ranges & semver (7)
  • version 버전과 정확히 일치해야합니다
  • >version 버전보다 커야합니다
  • >=version 기타
  • <version
  • <=version
  • 1.2.x 1.2.0, 1.2.1 등 1.3.0이 아님
  • http://sometarballurl (타르볼의 URL 일 수 있으며 로컬로 다운로드하여 설치됩니다.
  • * 모든 버전과 일치
  • latest 최신 릴리스를 얻습니다

위의 목록은 완전한 것이 아닙니다. 다른 버전 지정자에는 GitHub URL 및 GitHub 사용자 저장소, 특정 npm 태그가있는 로컬 경로 및 패키지가 포함됩니다.


8
정확한 1.2.0 || >=1.2.2 <1.3.01.2.0 또는 1.2.2 ~ 1.3.0 (포함)의 모든 버전을 지정할 수 있지만 1.2.1 또는 1.3.1 이상은 아니고 1.1도 아닙니다. .x 이하.
CodeManX 2016 년

보다 구체적인 링크는 위의-> docs.npmjs.com/files/package.json#dependencies
Toby

"Approximately equivalent to version""Compatible with version"^ 행동을 설명하는 등 실망스럽게도 비 특정의 방법 ~하고. 실제 답변을 제공 한 @jgillich에게 감사합니다!
Scott Stafford

635

npm을 사용하면 지정된 것보다 최신 버전의 패키지를 설치할 수 있습니다. 물결표 ( ~)를 사용하면 버그 수정 릴리스가 제공되고 캐럿 ( ^)은 이전 버전과 호환되는 새로운 기능도 제공합니다.

문제는 이전 버전은 대개 버그 수정을 많이받지 않으므로 npm은 caret ( ^)를 기본값으로 사용합니다 --save.

셈버 테이블

에 따르면 : "Semver 설명 - 내 package.json에 캐럿 (^)이 왜?" .

참고 규칙이 1.0.0 이상 버전에 적용되지 모든 프로젝트가 의미 버전을 다음 있음. 버전 0.xx의 경우 캐럿은 패치 업데이트 만 허용 합니다. 즉, 물결표와 동일하게 동작합니다. "캐럿 범위" 참조

다음은 개념에 대한 시각적 설명입니다.

셈버 다이어그램

출처 : "Semantic Versioning Cheatsheet" .


2
^ 0.2.5는 어떻습니까? 에서 docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4 : 캐럿 ^ 1.2.3 ^ 0.2.5 ^ 0.0.4 범위. [major, minor, patch] 튜플에서 0이 아닌 왼쪽 숫자를 수정하지 않는 변경을 허용합니다. 즉, 버전 1.0.0 이상의 패치 및 부 업데이트, 버전 0.X> = 0.1.0의 패치 업데이트 및 버전 0.0.X의 업데이트는 허용되지 않습니다.
rofrol

11
@rofrol 1.0.0 이전의 모든 버전은 불안정한 것으로 간주되며 이러한 규칙은 적용되지 않습니다
pspi

2
그래서 당신의 설명은 완전하지 않습니다
rofrol

5
@rofrol 예, 가독성을 생략하는 것이 좋은 경우가 있습니다. 패키지 json의 종속성에 대해 1.0.0 미만의 항목을 가질 가능성은 매우 낮습니다. 20/80 원칙 참조, 중요한 사항에 초점을 맞추기위한 훌륭한 규칙
pspi

1
@pspi 1.0.0 이하의 버전이 "아마도"없습니까? 60 개 중 우리는 ~ 15 개를 가지고 있으며, 대부분은 모호하지 않습니다.
Dave Newton

99

셈버

<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
  • 테스트 에는 npm semver 계산기 를 사용하십시오 . (^ (같은 주요 범위의 특정 버전보다 큰 모든 것을 포함) 및 ~ (동일한 작은 범위의 특정 버전보다 큰 모든 것을 포함)에 대한 설명은 100 % 정확하지 않지만 계산기는 제대로 작동하는 것 같습니다 )
  • 또는 SemVer Check를 대신 사용 하면 패키지를 선택할 필요가없고 설명도 제공합니다.

변경 허용 또는 금지

  • 핀 버전 : 1.2.3.
  • ^머리와 같은 것을 사용하십시오 . 왼쪽에서 0이 아닌 두 번째 수준의 업데이트를 허용합니다. ^0.2.3means 0.2.3 <= v < 0.3.
  • ~꼬리처럼 사용하십시오 . 일반적으로 가장 오른쪽 레벨을 고정하거나 생략하면 0을 설정합니다.
    • ~1 방법 1.0.0 <= v < 2.0.0
    • ~1.2의미 1.2.0 <= v < 1.3.0합니다.
    • ~1.2.4의미 1.2.4 <= v < 1.3.0합니다.
  • 가장 오른쪽 수준 생략 : 0.2의미 0.2 <= v < 1. 다음과 다른 ~이유 :
    • 생략 된 레벨 버전 시작은 항상 0
    • 하위 수준을 지정하지 않고 시작 주요 버전을 설정할 수 있습니다.

모든 (희망적으로) 가능성

시작 주요 수준을 설정하고 업데이트를 위로 허용

*  or "(empty string)   any version
1                         v >= 1

메이저 레벨 동결

~0 (0)            0.0 <= v < 1
0.2               0.2 <= v < 1          // Can't do that with ^ or ~ 
~1 (1, ^1)        1 <= v < 2
^1.2              1.2 <= v < 2
^1.2.3            1.2.3 <= v < 2
^1.2.3-beta.4     1.2.3-beta.4 <= v < 2

마이너 레벨 동결

^0.0 (0.0)        0 <= v < 0.1
~0.2              0.2 <= v < 0.3
~1.2              1.2 <= v < 1.3
~0.2.3 (^0.2.3)   0.2.3 <= v < 0.3
~1.2.3            1.2.3 <= v < 1.3

패치 레벨 동결

~1.2.3-beta.4     1.2.3-beta.4 <= v < 1.2.4 (only beta or pr allowed)
^0.0.3-beta       0.0.3-beta.0 <= v < 0.0.4 or 0.0.3-pr.0 <= v < 0.0.4 (only beta or pr allowed)
^0.0.3-beta.4     0.0.3-beta.4 <= v < 0.0.4 or 0.0.3-pr.4 <= v < 0.0.4 (only beta or pr allowed)

업데이트 금지

1.2.3             1.2.3
^0.0.3 (0.0.3)    0.0.3

주의 : 메이저, 마이너, 패치 누락 또는 beta숫자없이 지정하는 any것은 누락 된 레벨 과 동일 합니다.

참고 : 0주요 수준 의 패키지를 설치할 때 업데이트는 새로운 베타 / pr 수준 버전 만 설치합니다! 그 때문에 npm세트 ^에서 기본값으로 package.json때 설치된 버전처럼 0.1.3그것은 모든 주요 / 마이너 / 패치 수준을 정지.


라이브러리와 개발자가 시스템을 이해하지 못하기 때문에 사람들이 0에서 프로젝트를 시작하지 않도록 지시하는 것은 끔찍한 해결책입니다. @asdfasdfads에 훨씬 더 나은 정보가 있다고 생각합니다.
ProLoser

@ProLoser 방금 시스템을 단순화해야한다고 생각하며 0.x 버전을 사용해서는 안됩니다.
rofrol

1
초기 라이프 사이클 개발 및 v0 사용 사례는 많은 의미가 있습니다. v0이 올바르게 작동하는 방법을 배우면 실제로 다른 초기 수명주기 프로젝트를 기대하게되었습니다. 즉, 프로젝트가 실제로는 아닐 때 프로젝트를 1.x (일명 : 안정)로 선언하지 않고도 많은 역 호환성을 가진 API를 빠르게 변경할 수 있습니다.
ProLoser

나는 그것을 이해하지만, 그것은 그것이 semver 및 한정자와 함께 작동하는 방식을 좋아하지 않습니다
rofrol

2
그것은 의견처럼 느껴지고 일반적으로 받아 들여지는 접근법으로 구성되어서는 안됩니다. 그리고 ^ 0.1.x는 완벽하게 패치를 얻습니다.
ProLoser

93

~주요 및 부수를 수정합니다. 종속성에서 버그 수정을 수용 할 준비가되었지만 호환되지 않는 변경을 원하지 않는 경우에 사용됩니다.

^주요 번호 만 수정합니다. 의존성을 면밀히 관찰 할 때 사용되며 부 릴리스가 호환되지 않는 경우 코드를 빠르게 변경할 수 있습니다.

그 외에도 ^되어 지원되지 않는 오래된 NPM 버전으로,주의를 요합니다.

따라서 ^좋은 기본값이지만 완벽하지는 않습니다. 가장 유용한 semver 연산자를 신중하게 선택하고 구성하는 것이 좋습니다.


13
사실이 아님 : 캐럿 범위 ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. [major, minor, patch] 튜플에서 0이 아닌 왼쪽 숫자를 수정하지 않는 변경을 허용합니다. 즉, 버전 1.0.0 이상의 패치 및 부 업데이트, 버전 0.X> = 0.1.0의 패치 업데이트 및 버전 0.0.X의 업데이트는 허용되지 않습니다. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

6
이 답변은 완전히 잘못되었습니다 (여기의 다른 많은 사람들과 마찬가지로) 이 중 어느 것도 큰 숫자를 고치지 않습니다! @rofrol이 말했듯이 ^는 가장 왼쪽에있는 0이 아닌 숫자를 그대로 유지합니다. 반면에 마이너 버전이 지정되어 있으면 패치 업데이트 만 허용되고 (예 : ~ 1.2.3 또는 ~ 1.2) 마이너 버전이 지정되지 않으면 마이너 업데이트가 허용됩니다 (예 : ~ 1).
TheBaj

2
@TheBaj "fix"는 "adjust"가 아니라 "define"( "fixate")을 의미하므로 주 번호가 처리되는 방식에 모두 동의합니다.
maaartinus

1
예,이 답변은 "고정, 고정 또는 변경하지 않음"과 같이 "답"을 의미한다는 것을 깨달을 때까지 완전히 거꾸로 보였습니다.
NattyC

57

~: 합리적으로 가까이

   ~1.1.5: 1.1.0 <= accepted < 1.2.0

^: 지원

   ^1.1.5: 1.1.5 <= accepted < 2.0.0

   ^0.1.3: 0.1.3 <= accepted < 0.2.0

   ^0.0.4: 0.0.4 <= accepted < 0.1.0

17
@kytwb-아뇨. 제로 릴리즈 버전 번호의 특수한 경우 캐럿은 물결표와 같습니다. 따라서 약간만 증가하더라도 ^0.1.3버전 만 허용하고을 수락 0.1.x하지 않습니다 0.2.0. 이 동작은과 같습니다 ~0.1.3. 이 동작의 이유는 제로 릴리즈 패키지가 여전히 불안정한 것으로 간주되기 때문입니다. semver.org , # 4 의 단어 에서 "언제든지 변경 될 수 있습니다"(뒤로 호환되지 않는 변경 포함).
chharvey

31

^1. [any]. [any] (최신 부 버전)
~는 1.2입니다. [any] (최신 패치)

semver가 npm에 적용되는 방법 과 semver 표준 http://blog.npmjs.org/post/98131109725/npm-2-0-0에 맞추기 위해 수행하는 작업 에 대한 블로그 게시물 을 읽어보십시오.


2
사실이 아님 : 캐럿 범위 ^ 1.2.3 ^ 0.2.5 ^ 0.0.4. [major, minor, patch] 튜플에서 0이 아닌 왼쪽 숫자를 수정하지 않는 변경을 허용합니다. 즉, 버전 1.0.0 이상의 패치 및 부 업데이트, 버전 0.X> = 0.1.0의 패치 업데이트 및 버전 0.0.X의 업데이트는 허용되지 않습니다. docs.npmjs.com/misc/semver#caret-ranges-1-2-3-0-2-5-0-0-4
rofrol

28

이 업데이트 실 거예요 때문에 모자 매칭은 고려 "파괴"할 수있다 ^0.1.20.2.0. 소프트웨어가 등장 할 때 0.x.y버전과 모자 일치는 마지막으로 변하는 숫자 ( y) 와만 일치합니다 . 이것은 의도적으로 이루어집니다. 그 이유는 소프트웨어가 진화하는 동안 API 변경이 빠르게 진행되기 때문입니다. 언젠가 이러한 메소드가 있고 다른 날에는 해당 메소드가 있으며 이전 메소드는 사라졌습니다. 이미 라이브러리를 사용하는 사람들을 위해 코드를 나누지 않으려면 주요 버전을 늘리십시오 (예 : 1.0.0-> 2.0.0->) 3.0.0. 따라서 소프트웨어가 마침내 100 % 완성되고 모든 기능을 갖춘 시점에는 버전 11.0.0과 같 으며 의미가 없어 보이며 실제로 혼란스러워 보입니다. 반면에 0.1.x->0.2.x-> 0.3.x버전은 소프트웨어가 최종적으로 100 % 완료되고 모든 기능을 갖춘 시점에 버전으로 릴리스되며 1.0.0"이 릴리스는 장기 서비스 버전이므로 프로덕션 환경에서이 버전의 라이브러리를 사용하여 계속 사용할 수 있습니다" 코드를 작성하고 저자는 내일 또는 다음 달에 모든 것을 변경하지 않으며 패키지를 포기하지 않을 것입니다. "

규칙은 : 사용 0.x.y하는 소프트웨어는 아직 성숙하지 않은 경우 버전 및 공개 API의 변화가 중간 숫자 증가로 해제 (그러므로 사람이 필요 ^0.1.0하지 않습니다 0.2.0업데이 트를하고 자신의 암호를 해독하지 않습니다). 그런 다음 소프트웨어가 성숙되면 1.0.0공개 API가 변경 될 때마다 소프트웨어를 해제 하고 가장 왼쪽 숫자를 늘리십시오 (따라서 사람들 ^1.0.02.0.0업데이트를받지 않고 코드를 위반하지 않습니다).

Given a version number MAJOR.MINOR.PATCH, increment the:

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

이 의견은 말도 안되게 도움이되었으며 문서화가 잘되지 않은 것 같습니다. 이 동작에 관한 문서로 연결되는 링크가 있습니까? v0 프로젝트에 대한이 답변은 많은 도움이되었습니다.
ProLoser

나는 링크가 없다 : 나는 인터넷 검색 및 npm 의미 버전 계산기 semver.npmjs.com
catamphetamine

2
보다 공식적인 방식으로 설명서에 추가해야합니다. 엔지니어링 팀에게 소니가 간과하기 쉬워서 대화를 나 gave습니다. slides.com/proloser/semver-v0
ProLoser

24

~ 물결표 :

  • ~주요 숫자와 부 숫자를 고정시킵니다 .
  • 종속성에서 버그 수정을 수용 할 준비가되었지만 호환되지 않는 변경을 원하지 않는 경우에 사용됩니다.
  • 물결표는 가장 최근의 부 버전 (중간 숫자) 과 일치합니다 .
  • ~ 1.2.3은 모든 1.2.x 버전과 일치하지만 1.3.0이 누락됩니다.
  • 물결표 (~)는 버그 수정 릴리스를 제공합니다.

^ 캐럿 :

  • ^ 메이저 번호 만 고정합니다.
  • 의존성을 면밀히 관찰 할 때 사용되며 부 릴리스가 호환되지 않는 경우 코드를 빠르게 변경할 수 있습니다.
  • 그것은 당신을 업데이트 할 것입니다 가장 최근의 주요 버전 (첫 번째 숫자).
  • ^ 1.2.3은 1.3.0을 포함한 모든 1.xx 릴리스와 일치하지만 2.0.0에서는 보류됩니다.
  • 캐럿 (^)은 이전 버전과 호환되는 새로운 기능도 제공합니다.

1
물결표는 최신 패치 버전 (마지막 번호)과 일치합니다. 캐럿은 가장 최근의 부 버전 (중간 숫자)과 일치합니다.
Abdul Rauf

"동결"이 가장 좋은 설명입니다.
mhrabiee

캐럿은 주 번호를 고정시키고 가장 최근의 주 버전 (첫 번째 번호)으로 업데이트합니까? 주 번호는 첫 번째 번호이므로 의미가 없습니다.
NattyC

19

Tilde ~ 는 부 버전과 일치합니다. 1.4.2가 포함 된 패키지를 설치하고 설치 후 package.json에 버전 1.4.3 및 1.4.4를 사용할 경우 ~ 1.4.2로 사용 된 후 npm 설치 업그레이드 후 프로젝트에서 프로젝트에 1.4.4를 설치합니다. 그러나 해당 패키지에 사용 가능한 1.5.0이 있으면 ~로 설치되지 않습니다. 부 버전이라고합니다.

캐럿 ^ 1.4.2 패키지 프로젝트와 설치 1.5.0 ^ 주요 버전을 설치합니다 다음 출시 이후에 설치되어있는 경우, 주 버전과 일치합니다. ^ 1.4.2 인 경우 2.1.0을 설치할 수 없습니다 .

버전을 고정 하면 다음 특수 문자 예에서 고정 버전을 사용하는 각 설치에 대한 패키지의 변경 버전으로 원하지 않는 경우 "1.4.2"

최신 버전 * 최신 버전을 설치하려면 패키지 이름 앞에 * 만 사용하십시오.


3
이 답변은 잘못된 것입니다. SemVer는 다음과 같이 명시합니다 . 일반 버전 번호는 반드시 XYZ 형식이어야합니다. 여기서 X는 주 버전이고 Y는 부 버전이고 Z는 패치 버전입니다.
Leo

15

한 라이너 설명

표준 버전 관리 시스템은 major.minor.build입니다 (예 : 2.4.1).

npm은 이러한 문자를 기반으로 특정 패키지의 버전을 확인하고 수정합니다.

~ : 메이저 버전은 고정, 마이너 버전은 고정, 모든 빌드 번호와 일치

예 : ~ 2.4.1은 x가 무엇이든 2.4.x를 검사 함을 의미합니다.

^ : 메이저 버전은 고정되어 있으며 마이너 버전과 일치하며 빌드 번호와 일치합니다.

예 : ^ 2.4.1은 x가 무엇이든 2.xx를 확인한다는 의미입니다.


5
이 답변에서 7 줄을 봅니다
FluxLemur

11

package.json에서 물결표 (~)와 캐럿 (^)을 보셨을 것입니다. 그들 사이의 차이점은 무엇입니까?

npm install moment --save를 수행하면 caret (^) 접두사와 함께 package.json에 항목이 저장됩니다.

물결표 (~)

가장 간단한 용어로, 물결표 (~)는 가장 최근의 부 버전 (중간 숫자)과 일치합니다. ~ 1.2.3은 모든 1.2.x 버전과 일치하지만 1.3.0이 누락됩니다.

캐럿 (^)

반면에 캐럿 (^)은 더 편안합니다. 최신 메이저 버전 (첫 번째 숫자)으로 업데이트됩니다. ^ 1.2.3은 1.3.0을 포함한 모든 1.xx 릴리스와 일치하지만 2.0.0에서는 보류됩니다.

참조 : https://medium.com/@Hardy2151/caret-and-tilde-in-package-json-57f1cbbe347b


다시,이 답변은 잘못된 것입니다. SemVer는 다음과 같이 명시합니다 . 일반 버전 번호는 반드시 XYZ 형식이어야합니다. 여기서 X는 주 버전이고 Y는 부 버전이고 Z는 패치 버전입니다.
Leo

5

semver는 3 개의 주요 섹션으로 구분되며 점으로 구분됩니다.

major.minor.patch
1.0.0

이러한 서로 다른 주, 부 및 패치는 서로 다른 릴리스를 식별하는 데 사용됩니다. 조수 (~) 및 캐럿 (^)은 패키지 버전 관리에 사용할 부 버전 및 패치 버전을 식별하는 데 사용합니다.

~1.0.1
 Install 1.0.1 or **latest patch versions** such as 1.0.2 ,1.0.5
^1.0.1
 Install 1.0.1 or **latest patch and minor versions** such as 1.0.2 ,1.1.0 ,1.1.1

4

물결표 (~)

메이저 버전은 고정, 마이너 버전은 고정, 모든 빌드 번호와 일치

"express": "~4.13.3" 

~4.13.3 x가 임의이고 4.14.0 인 경우 4.13.x를 검사 함을 의미합니다.

캐럿 (^)

메이저 버전은 고정되어 있으며, 마이너 버전과 일치하며, 빌드 번호와 일치합니다

"supertest": "^3.0.0"

^3.0.0 x가 무엇이든 3.xx를 확인한다는 의미입니다.


이 답변이 4 년 전 게시 된 동일한 답변과 어떻게 다른지 자세히 설명해 주 시겠습니까?
Franklin Yu

2

버전 번호는 각 섹션을 다른 의미로 지정하는 구문입니다. 구문은 점으로 구분 된 세 개의 섹션으로 나뉩니다.

major.minor.patch 1.0.2

메이저, 마이너 및 패치는 패키지의 다른 릴리스를 나타냅니다.

npm은 물결표 (~) 및 캐럿 (^)을 사용하여 각각 사용할 패치 및 부 버전을 지정합니다.

따라서 ~ 1.0.2가 표시되면 버전 1.0.2 또는 최신 패치 버전 (예 : 1.0.4)을 설치한다는 의미입니다. ^ 1.0.2가 표시되면 버전 1.0.2 또는 최신 마이너 또는 패치 버전 (예 : 1.1.0)을 설치한다는 의미입니다.


1
이 답변이 4 년 전 게시 된 동일한 답변과 어떻게 다른지 자세히 설명해 주 시겠습니까?
Franklin Yu

2

캐럿 ^ 은 동일한 주요 범위에서 특정 버전보다 큰 모든 것을 포함합니다.

물결표 ~ 는 같은 작은 범위에서 특정 버전보다 큰 모든 것을 포함합니다.

예를 들어, 허용 가능한 버전 범위를 최대 1.0.4로 지정하려면 다음 구문을 사용하십시오.

  • 패치 릴리스 : 1.0 또는 1.0.x 또는 ~ 1.0.4
  • 부 버전 : 1 또는 1.x 또는 ^ 1.0.4
  • 주요 릴리스 : * 또는 x

의미 버전 관리 구문에 대한 자세한 내용은 npm semver calculator를 참조하십시오 .

게시 된 패키지의 npm 시맨틱 버전

NPM 문서에서 더 많은 의미 버전 소개


1

그 자체로는 답이 아니라 간과 된 것으로 보인다.

캐럿 범위에 대한 설명 :

참조 : https://github.com/npm/node-semver#caret-ranges-123-025-004

[major, minor, patch] 튜플에서 0이 아닌 왼쪽 숫자를 수정하지 않는 변경을 허용합니다.

^10.2.3일치하는 수단10.2.3 <= v < 20.0.0

나는 그것이 그들이 의미하는 바라고 생각하지 않습니다. 버전 11.xx에서 19.xx를 가져 오면 코드가 손상됩니다.

나는 그들이 의미한다고 생각 left most non-zero number field합니다. SemVer에는 숫자 필드가 한 자리 숫자 여야하는 것이 없습니다.


0

~ 부 버전 릴리스에 해당 ^ ^ 메이저 버전 릴리스에 지정

예를 들어 패키지 버전이 4.5.2 인 경우 ~ 4.5.2 업데이트에서 최신 4.5.x 버전 (최소 버전)을 설치합니다 ^ 4.5.2는 최신 4.xx 버전 (MAJOR VERSION)을 설치합니다


8
이 답변이 4 년 전 게시 된 동일한 답변과 어떻게 다른지 자세히 설명해 주 시겠습니까?
Franklin Yu

0

이 질문과 관련하여 버전에 대한 Composer 설명서를 검토 할 수 있지만 여기서 간단히 설명하면 다음과 같습니다.

  • 틸드 버전 범위 ( ~ )-~ 1.2.3은> = 1.2.3 < 1.3.0과 같습니다.
  • 캐럿 버전 범위 ( ^ )-~ 1.2.3은> = 1.2.3 < 2.0.0과 같습니다.

따라서 Tilde 를 사용하면 자동으로 패치를 업데이트 할 수 있지만 부 버전과 주 버전은 업데이트되지 않습니다. 그러나 Caret 를 사용 하면 패치 및 부 버전이 제공되지만 주요 (중단 변경) 버전은 제공되지 않습니다.

Tilde Version은 "safer"접근 방식으로 간주되지만, 신뢰할 수있는 의존성 (잘 관리 된 라이브러리)을 사용하는 경우 사소한 변경으로 인해 변경이 중단되지 않기 때문에 Caret Version에 아무런 문제가 없습니다.

composer 설치와 composer 업데이트의 차이점에 대해서는이 stackoverflow 게시물을 검토해야합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.