bower (및 npm) 버전 구문은 무엇입니까?


274

Bower를 사용하면 다음 구문을 사용하여 패키지의 버전 요구 사항을 지정할 수 있습니다.

"dependencies": {
  "<name>": "<version>",
},

그러나에 사용할 구문이 무엇인지 찾을 수 없었습니다 <version>. 버전을 지정할 수 있음을 알고 있습니다.

  • 특정 버전보다 ">1.0.0"
  • 버전 이상 ">=1.0.0"
  • 또는 일부 범위에서 : "1.0.0 - 2.0.0".

또한 물결표를 포함하는 공통 버전 구문이 있음을 알고 "~1.0.0"있습니다. 그러나 그것이 의미하는 바와 그것이 같은지 확실하지 않습니다 "=1.0.0".

또한 정확히 1.0.3더 큰 버전과 같은 여러 비 연속 버전을 지정할 수 있는지 여부에 관심이 있습니다 1.5.0.


답변:


341

간단히 말해서 Bower 버전 번호 (및 NPM)의 구문을 SemVer라고하며 '시맨틱 버전 관리 (Semantic Versioning)'의 줄임말입니다. Node / npm 내의 semver 파서 용 API에서 Bower 및 NPM에 사용 된 SemVer의 자세한 구문에 대한 문서를 찾을 수 있습니다 . semver.org 에서 기본 스펙 ( 다른 구문 세부 사항은 언급 하지 않음) 에 대해 자세히 알아볼 수 있습니다 .~

가지고 다닐 수 있는 매우 유용한 비주얼 셈버 계산기가있어이 모든 것을 쉽게 확인하고 테스트 할 수 있습니다.

SemVer는 단순한 구문이 아닙니다! API를 게시하는 올바른 방법에 대해 말해야 할 흥미로운 사실이 있는데, 이는 구문의 의미를 이해하는 데 도움이됩니다. 결정적으로 :

퍼블릭 API를 식별 한 후에는 버전 번호를 특정 단위로 변경하여 변경 사항을 전달합니다. XYZ (Major.Minor.Patch)의 버전 형식을 고려하십시오 . API에 영향을주지 않는 버그 수정은 패치 버전을 증가시키고 이전 버전과 호환되는 API 추가 / 변경은 부 버전을 증가시키고 하위 버전과 호환되지 않는 API 변경은 주 버전을 증가시킵니다.

따라서 귀하의 특정 질문 ~은 해당 Major.Minor.Patch 스키마와 관련이 있습니다. (관련 캐럿 연산자와 마찬가지로 ^) 사용할 수있는 ~버전의 범위를 좁히는 데 사용할 수 있습니다 .

  • 동일한 부 버전으로의 후속 패치 레벨 변경 ( "버그 수정은 API에 영향을 미치지 않습니다" ) 또는
  • 동일한 메이저 버전에 대한 후속 마이너 레벨 변경 ( "이전 버전과 호환되는 API 추가 / 변경" )

예를 들어 1.2.x 트리에서 1.2.0으로 시작하지만 1.3.0보다 작은 이후의 패치 수준 변경을 수행하려면 다음을 사용할 수 있습니다.

"angular": "~1.2"
  or:
"angular": "~1.2.0"

또한 .x구문 을 사용하는 것과 동일한 결과를 얻습니다 .

"angular": "1.2.x"

그러나 물결표 / ~구문을 더 구체적으로 사용할 수 있습니다. 1.2.4로 시작 하지만 여전히 1.3.0 미만의 패치 수준 변경 만 기꺼이 받아들이 려면 다음을 사용하십시오.

"angular": "~1.2.4"

당신이 사용하는 경우 주요 버전을 향해 왼쪽으로 이동 ...

"angular": "~1"

...와 같습니다 ...

"angular": "1.x"
  or:
"angular": "^1.0.0"

... 1.0.0 이상 2.0 미만의 사소한 또는 패치 수준 변경 사항과 일치합니다.

위의 마지막 변형은 '캐럿 범위' 라고합니다 . 캐럿은처럼 끔찍한 것처럼 보이 >므로 " 1.0.0 보다 큰 버전"을 의미한다고 생각하면 변명 할 수 있습니다 . (나는 확실히 그것에 미끄러졌다.) 아니!

캐럿 범위는 기본적으로 가장 왼쪽의 유효 숫자 (일반적으로 주 버전) 에만 관심이 있고 가장 왼쪽의 숫자에 영향을 미치지 않는 사소한 또는 패치 수준의 변경을 허용 한다고 말하는 데 사용됩니다 . 그러나 메이저 버전을 지정하는 물결표 범위와 달리 캐럿 범위를 사용하면 정확한 부 / 패치 시작점을 지정할 수 있습니다. 따라서 ^1.0.0 === ~1캐럿 범위 ^1.2.3는 변경 사항이 있다고 말할 수 있습니다 >=1.2.3 && <2.0.0. 물결표 범위로는 그렇게 할 수 없었습니다.

가까이서 보면 처음에는 혼란스러워 보입니다. 그러나 잠깐 동안 축소하고 다음과 같이 생각 하십시오. 캐럿은 가장 중요한 숫자가 무엇이든 가장 염려한다고 말할 수 있습니다. 물결표를 사용하면 가장 오른쪽에있는 숫자가 가장 걱정된다고 말할 수 있습니다. 나머지는 상세하다.

사람들이 왜 단순한 .x구문 보다 훨씬 더 많이 사용하는지 설명하는 것은 물결표와 캐럿의 표현력 입니다. 그래서 물결표가 자주 사용되는 곳에서도 물결표가 자주 사용되는 .x것을 볼 수 있습니다. 예를 들어, npm 자체를 참조하십시오. 자체 package.json 파일은 사용할 ~2.4.0 있는 2.4.x형식이 아닌 형식으로 많은 종속성을 포함 합니다. 을 고수함으로써 구문은 허용되는 시작 패치 번호에 관계없이 70 개 이상의 버전 종속 항목 목록과 일치합니다.~

어쨌든 여전히 SemVer에는 더 많은 것이 있지만 여기서 자세히 설명하지는 않습니다. 노드 semver 패키지의 readme 에서 확인하십시오 . 그리고 SemVer의 작동 방식에 대해 연습하고 이해하는 동안 의미 체계 버전 계산기 를 사용해야 합니다.


RE : 비 연속 버전 번호 : OP의 최종 질문은 비 연속 버전 번호 / 범위 지정에 관한 것 같습니다 (공평하게 편집 한 경우). 예, 일반적인 이중 파이프 "또는"연산자를 사용하면 ||됩니다. 이렇게 :

"angular": "1.2 <= 1.2.9 || >2.0.0"

27
따라서 ~특히 패치 (3) 수는 지정된 것보다 클 수 있습니다 (예 : ~1.2.3와 동일 함) >=1.2.3 <1.3.0.
z0r

1
위의 인라인 편집에 따라 마이너 (두 번째) 번호에도 사용할 수 있습니다.
XML

흥미롭게도 SemVer 문서는 x- 표기법을 허용하는 것으로 보입니다 (이것은 인간에게 훨씬 더 직관적입니다).
Frank Nocke

2
x- 표기법은 처음에는 읽기에 직관적이지만 훨씬 덜 융통성 있습니다. 예를 들어 '1.1.x' === '>=1.1.0' === '~1.1.0'. 1.1.0 사례는 쉽습니다. 그러나 X-표기는 할 수있는 한, 세분화 될 수 없다 '>=1.1.4'거나 '~1.1.4'. 따라서 '1.1.x'의존성 목록의 한 곳과 '~2.7.3'다른 곳에서 시작합니다. 그것은 훌륭하고 작동하지만 개발자는 단일 목록을 읽으려면 여러 구문을 구문 분석해야합니다. 또한 프로그래밍 방식으로 버전을 설정하기 위해 패키지를 작성하는 경우 단일 구문이 필요합니다. 그리고 대부분의 사람들은 주요 변경 내용을 방지하려고합니다. 따라서 모든 문제는로 해결되었습니다 ~.
XML

1
하 나는 "grok"이 괴상한 문화 (그리고 아마도 연령 관련) @Clonkex보다 덜 지리적이라고 생각한다. 미래의 독자들을 위해 : 그것은 이상한 땅에서 하인라인의 낯선 사람에 대한 참조입니다 ...
XML

141

semver따라 사용할 수 있습니다

  • 하이픈 범위 XYZ-ABC는 > = 1.2.3 <= 2.3.4를 1.2.3-2.3.4 나타냅니다.

  • X- 범위 1.2.x 1.X 1.2.*

  • 틸드 범위 ~1.2.3 ~1.2 패치 수준 변경 또는 사소한 버전 변경을 허용 함을 나타냅니다.

  • 캐럿 범위 ^ 1.2.3 ^ 0.2.5 ^ 0.0.4

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

    • ^1.2.x (> = 1.2.0 <2.0.0을 의미)
    • ^0.0.x (== 0.0.0 <0.1.0을 의미)
    • ^0.0 (== 0.0.0 <0.1.0을 의미)

21
말도 안되고 읽기 쉬운 답변에 감사드립니다. 추적 할 필요가 없었습니다. 붐, 답이 있습니다. 잘 했어요;)
toddmo

76

Bower는 semver 구문을 사용 합니다. 하지만 다음은 몇 가지 간단한 예입니다.

특정 버전을 설치할 수 있습니다.

$ bower install jquery#1.11.1

~를 사용하여 '이로 시작하는 모든 버전'을 지정할 수 있습니다.

$ bower install jquery#~1.11

여러 버전 요구 사항을 함께 지정할 수 있습니다.

$ bower install "jquery#<2.0 >1.10"

1
나는 이것을 실제로 사용하는 것에 대해 궁금하다. 룰렛 설치?
gravidThoughts

@XMLilley의 답변 (및 semver 문서) 'start 's with'를 보면 1.12, 1.13, 메이저 버전이 올라 가지 않는 한 괜찮습니다 ...
Frank Nocke

13

latest키워드를 사용하여 사용 가능한 최신 버전을 설치할 수도 있습니다.

  "dependencies": {
    "fontawesome": "latest"
  }

1
semver 는 이것을 언급하지 않습니다. 어디에서 유효합니까? :) 그것은 " "*" := >=0.0.0(모든 버전이 만족합니다)"라고 말합니다.
GazB

솔직히 말해서, 그것은 시행 착오였습니다-나는 그것을 시도했고 효과가있었습니다! 100 % 유효하지 않은 것이 맞지만 작동합니다.
shacker

7

패치 번호가없는 경우 물결표가 아닌 버전 ~에 추가 .x하는 것과 같습니다 . 패치 번호가 있으면 ~지정된 모든 패치 번호> =를 허용하십시오.

~1     := 1.x
~1.2   := 1.2.x
~1.2.3 := (>=1.2.3 <1.3.0)

내가 허용 대답에 코멘트에 포인트가 부족하지 않지만, 물결표 정보의 일부는 문서 semver 링크와 확률에 있습니다 : "angular": "~1.2"없는 1.3, 1.4, 1.4.9 일치합니다. 또한 "angular": "~1"하고 "angular": "~1.0"있습니다 없습니다 해당. 이것은 npm semver calculator 로 확인할 수 있습니다 .

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