나는 안정적인 최신으로 업그레이드 한 후 node
그리고 npm
, 나는 시도했다 npm install moment --save
. package.json
캐럿 ^
접두사를 사용 하여 항목을 저장합니다 . 이전에는 물결표 ~
접두사였습니다.
- 왜 이러한 변경이 이루어
npm
집니까? - 물결표
~
와 캐럿 의 차이점은 무엇입니까^
? - 다른 사람보다 장점이 무엇입니까?
나는 안정적인 최신으로 업그레이드 한 후 node
그리고 npm
, 나는 시도했다 npm install moment --save
. package.json
캐럿 ^
접두사를 사용 하여 항목을 저장합니다 . 이전에는 물결표 ~
접두사였습니다.
npm
집니까?~
와 캐럿 의 차이점은 무엇입니까 ^
?답변:
참고 항목 NPM의 문서 및 semver 문서를
~ version“대략 버전과 동일”, 부 버전을 늘리지 않고 향후 모든 패치 버전으로 업데이트합니다. ~1.2.3
1.2.3에서 <1.3.0까지의 릴리스를 사용합니다.
^ 버전“호환 가능”은 주 버전을 증가시키지 않고 향후 모든 부 / 패치 버전으로 업데이트합니다. ^2.3.4
2.3.4에서 <3.0.0까지의 릴리스를 사용합니다.
아래의 주석을 참조하십시오.
^
또는 a로 버전 앞에 붙는 npm의 모든 넌센스를 제거 할 수 있습니다 ~
. 버전을 엄격하게 제어하려면 다음을 설정하십시오. npm config set save-prefix=''
0.2.x
, 2
하지 않은 것입니다 major version
. 그래서 docs.npmjs.com에서 다음과 같은 특정 단어를 사용했습니다 the left-most non-zero digit
. 이 사건에 대해 또 무엇을 : ^ 0.0.4 수단 0.0.4
A
3 개 버전 : 0.0.1
, 0.0.2
및 0.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
를 사용하면 이 문제를 피할 수 있습니다.
질문에 언급 된 방법을 포함하여 버전 특이성에 대한 모든 방법을 설명하는 공식 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 태그가있는 로컬 경로 및 패키지가 포함됩니다.
1.2.0 || >=1.2.2 <1.3.0
1.2.0 또는 1.2.2 ~ 1.3.0 (포함)의 모든 버전을 지정할 수 있지만 1.2.1 또는 1.3.1 이상은 아니고 1.1도 아닙니다. .x 이하.
"Approximately equivalent to version"
및 "Compatible with version"
^ 행동을 설명하는 등 실망스럽게도 비 특정의 방법 ~하고. 실제 답변을 제공 한 @jgillich에게 감사합니다!
npm을 사용하면 지정된 것보다 최신 버전의 패키지를 설치할 수 있습니다. 물결표 ( ~
)를 사용하면 버그 수정 릴리스가 제공되고 캐럿 ( ^
)은 이전 버전과 호환되는 새로운 기능도 제공합니다.
문제는 이전 버전은 대개 버그 수정을 많이받지 않으므로 npm은 caret ( ^
)를 기본값으로 사용합니다 --save
.
에 따르면 : "Semver 설명 - 내 package.json에 캐럿 (^)이 왜?" .
참고 규칙이 1.0.0 이상 버전에 적용되지 모든 프로젝트가 의미 버전을 다음 있음. 버전 0.xx의 경우 캐럿은 패치 업데이트 만 허용 합니다. 즉, 물결표와 동일하게 동작합니다. "캐럿 범위" 참조
다음은 개념에 대한 시각적 설명입니다.
<major>.<minor>.<patch>-beta.<beta> == 1.2.3-beta.2
1.2.3
.^
머리와 같은 것을 사용하십시오 . 왼쪽에서 0이 아닌 두 번째 수준의 업데이트를 허용합니다. ^0.2.3
means 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
그것은 모든 주요 / 마이너 / 패치 수준을 정지.
~
주요 및 부수를 수정합니다. 종속성에서 버그 수정을 수용 할 준비가되었지만 호환되지 않는 변경을 원하지 않는 경우에 사용됩니다.
^
주요 번호 만 수정합니다. 의존성을 면밀히 관찰 할 때 사용되며 부 릴리스가 호환되지 않는 경우 코드를 빠르게 변경할 수 있습니다.
그 외에도 ^
되어 지원되지 않는 오래된 NPM 버전으로,주의를 요합니다.
따라서 ^
좋은 기본값이지만 완벽하지는 않습니다. 가장 유용한 semver 연산자를 신중하게 선택하고 구성하는 것이 좋습니다.
~
: 합리적으로 가까이 에
~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
^0.1.3
버전 만 허용하고을 수락 0.1.x
하지 않습니다 0.2.0
. 이 동작은과 같습니다 ~0.1.3
. 이 동작의 이유는 제로 릴리즈 패키지가 여전히 불안정한 것으로 간주되기 때문입니다. semver.org , # 4 의 단어 에서 "언제든지 변경 될 수 있습니다"(뒤로 호환되지 않는 변경 포함).
^
1. [any]. [any] (최신 부 버전)
~
는 1.2입니다. [any] (최신 패치)
semver가 npm에 적용되는 방법
과 semver 표준 http://blog.npmjs.org/post/98131109725/npm-2-0-0에 맞추기 위해 수행하는 작업 에 대한 블로그 게시물 을 읽어보십시오.
이 업데이트 실 거예요 때문에 모자 매칭은 고려 "파괴"할 수있다 ^0.1.2
로 0.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.0
은 2.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.
~ 물결표 :
~
주요 숫자와 부 숫자를 고정시킵니다 .^ 캐럿 :
^
메이저 번호 만 고정합니다.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"
최신 버전 * 최신 버전을 설치하려면 패키지 이름 앞에 * 만 사용하십시오.
한 라이너 설명
표준 버전 관리 시스템은 major.minor.build입니다 (예 : 2.4.1).
npm은 이러한 문자를 기반으로 특정 패키지의 버전을 확인하고 수정합니다.
~ : 메이저 버전은 고정, 마이너 버전은 고정, 모든 빌드 번호와 일치
예 : ~ 2.4.1은 x가 무엇이든 2.4.x를 검사 함을 의미합니다.
^ : 메이저 버전은 고정되어 있으며 마이너 버전과 일치하며 빌드 번호와 일치합니다.
예 : ^ 2.4.1은 x가 무엇이든 2.xx를 확인한다는 의미입니다.
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는 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
물결표 (~)
메이저 버전은 고정, 마이너 버전은 고정, 모든 빌드 번호와 일치
"express": "~4.13.3"
~4.13.3
x가 임의이고 4.14.0 인 경우 4.13.x를 검사 함을 의미합니다.
캐럿 (^)
메이저 버전은 고정되어 있으며, 마이너 버전과 일치하며, 빌드 번호와 일치합니다
"supertest": "^3.0.0"
^3.0.0
x가 무엇이든 3.xx를 확인한다는 의미입니다.
버전 번호는 각 섹션을 다른 의미로 지정하는 구문입니다. 구문은 점으로 구분 된 세 개의 섹션으로 나뉩니다.
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.0.4로 지정하려면 다음 구문을 사용하십시오.
의미 버전 관리 구문에 대한 자세한 내용은 npm semver calculator를 참조하십시오 .
NPM 문서에서 더 많은 의미 버전 소개
그 자체로는 답이 아니라 간과 된 것으로 보인다.
캐럿 범위에 대한 설명 :
참조 : 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에는 숫자 필드가 한 자리 숫자 여야하는 것이 없습니다.
~ 부 버전 릴리스에 해당 ^ ^ 메이저 버전 릴리스에 지정
예를 들어 패키지 버전이 4.5.2 인 경우 ~ 4.5.2 업데이트에서 최신 4.5.x 버전 (최소 버전)을 설치합니다 ^ 4.5.2는 최신 4.xx 버전 (MAJOR VERSION)을 설치합니다
이 질문과 관련하여 버전에 대한 Composer 설명서를 검토 할 수 있지만 여기서 간단히 설명하면 다음과 같습니다.
따라서 Tilde 를 사용하면 자동으로 패치를 업데이트 할 수 있지만 부 버전과 주 버전은 업데이트되지 않습니다. 그러나 Caret 를 사용 하면 패치 및 부 버전이 제공되지만 주요 (중단 변경) 버전은 제공되지 않습니다.
Tilde Version은 "safer"접근 방식으로 간주되지만, 신뢰할 수있는 의존성 (잘 관리 된 라이브러리)을 사용하는 경우 사소한 변경으로 인해 변경이 중단되지 않기 때문에 Caret Version에 아무런 문제가 없습니다.
composer 설치와 composer 업데이트의 차이점에 대해서는이 stackoverflow 게시물을 검토해야합니다 .
npm config set save-prefix=''
.. (~
당신이 선호하는 경우 따옴표를 붙입니다.) 나는 개인적 으로이 작업을 수행하고 생산 작업을 축소합니다.