Semver 검사기 & 버전 비교기

SemVer 2.0.0 버전을 분해·비교해 변경 종류를 알려 주고, ^1.2.0 같은 npm 범위에 드는지 확인하며, 버전을 올리고 목록을 정렬합니다.

버전 A · 분해
major: 1
minor: 2
patch: 0
prerelease: (없음)
build: (없음)
다음 버전:
버전 B · 분해
major: 1
minor: 10
patch: 0
prerelease: (없음)
build: (없음)
다음 버전:
버전 A가 버전 B보다 낮습니다. 변경 유형: minor — 하위 호환 기능 추가
비교
1.2.0 < 1.10.0

버전 A가 버전 B보다 낮습니다

변경 유형: minor — 하위 호환 기능 추가

package.json에 쓰는 형식 그대로: 캐럿·틸드 범위, 비교식, x 범위, 하이픈 범위, ||로 이은 대안.

유의적 버전 파싱 및 비교

1.2.0과 1.10.0 같은 두 버전을 입력하면 각각을 major, minor, patch, 프리릴리스(prerelease), 빌드 메타데이터로 즉시 분해하고, 어느 쪽이 우선순위가 높은지 알려주며, 둘 사이의 변경 유형 — major(호환성 파괴)·minor(기능 추가)·patch(수정)·프리릴리스 태그·빌드 메타데이터만 다름 — 도 함께 알려주어 업그레이드가 호환성을 깨는지 한눈에 볼 수 있습니다. 높은 쪽 버전이 프리릴리스이면(1.0.0과 2.0.0-alpha.1처럼) 변경 유형을 premajor·preminor·prepatch로 따로 부릅니다 — 지금 설치할 수 있는 호환성 파괴 변경이 아니라, 아직 정식 출시 전인 다음 릴리스의 미리보기라는 뜻입니다. 공식 SemVer 2.0.0 문법을 따르므로 v1.2.3, 1.2, 또는 01.2.3처럼 앞에 0이 붙은 버전은 조용히 통과시키지 않고 유효하지 않은 것으로 표시합니다. 다만 분해 결과 아래의 “이 버전을 뜻했나요?”가 앞의 v를 떼거나 빠진 부분을 채워, 그 입력이 가장 그럴듯하게 뜻하는 엄격한 버전을 버튼으로 제시하므로 누르기만 하면 칸이 바뀝니다. 입력한 버전과 정리된 형태가 다르면 분해 결과 아래의 “정리된 버전” 줄에 package.json에 넣는 형태 — 앞의 v, 앞뒤 공백, 빌드 메타데이터를 뺀 것 — 를 복사 버튼과 함께 보여 줍니다. 비교 아래의 범위 칸에 ^1.2.0, ~1.4.0, >=2.0.0 <3.0.0, 1.2.x || 2.x 같은 npm 범위를 넣으면 그 뜻을 풀어 쓰고 각 버전이 범위에 드는지 알려 줍니다. major·minor·patch 버튼으로 버전을 올릴 수 있고, 목록 칸에 버전을 한 줄에 하나씩 넣으면 낮은 버전부터 정렬합니다. “⇄ A와 B 바꾸기” 버튼은 두 버전을 한 번에 맞바꿉니다.

우선순위 판단 방식

major, minor, patch 숫자는 숫자로서 비교됩니다. 그래서 텍스트로는 '2'가 커 보여도 1.10.0이 1.2.0보다 높습니다. 이 값들이 같으면 프리릴리스 버전(예: 1.0.0-alpha)이 일반 릴리스(1.0.0)보다 낮게 평가됩니다. 이후 프리릴리스 식별자는 필드별로 비교되어, 모두 숫자인 필드는 숫자로, 나머지는 ASCII 순서로 비교하며, 숫자 필드가 비숫자 필드보다 낮고, 다른 조건이 같으면 필드가 더 많은 쪽이 이깁니다. + 뒤의 빌드 메타데이터는 표시를 위해 파싱하지만 우선순위 판단에서는 사양 그대로 무시됩니다.

자주 묻는 질문

왜 1.2.0이 1.10.0보다 낮나요?

유의적 버전은 각 부분을 텍스트가 아니라 숫자로 비교하기 때문입니다. 숫자로 10은 2보다 크므로, 문자열로는 '2'가 '1' 뒤에 정렬되더라도 1.10.0이 1.2.0보다 우선순위가 높습니다.

프리릴리스 버전은 어떻게 순위가 정해지나요?

프리릴리스 태그가 있는 버전은 태그가 없는 같은 버전보다 항상 낮습니다. 따라서 1.0.0-alpha는 1.0.0보다 아래입니다. 두 프리릴리스 태그는 식별자별로 비교되며, 숫자 필드는 숫자로, 나머지는 ASCII 순서로 비교하고, 숫자가 영숫자보다 낮으며, 나머지가 모두 같으면 식별자가 더 많은 쪽이 이깁니다.

package.json 범위에 버전이 드는지 확인할 수 있나요?

네. 범위 칸에 package.json에 쓰는 형식 그대로 — 캐럿(^1.2.0), 틸드(~1.4.0), 비교식(>=2.0.0 <3.0.0), x 범위(1.2.x), 하이픈 범위(1.2.3 - 2.3.4), ||로 이은 대안 — 넣으면 그 범위를 비교식으로 풀어 쓰고, 버전 A와 버전 B가 범위에 드는지 node-semver 규칙대로 알려 줍니다. 프리릴리스는 같은 릴리스의 프리릴리스를 적은 범위에만 맞는다는 규칙도 따릅니다. 정렬할 버전 칸에 한 줄에 하나씩 넣으면 낮은 버전부터 정렬하고, 범위를 만족하는 가장 높은 버전도 알려 줍니다.

앞에 v가 붙은 git 태그나 patch가 빠진 버전도 고쳐 주나요?

네, 제안으로 고쳐 줍니다. 엄격한 판정은 그대로라서 그런 입력은 여전히 “유효한 유의적 버전(semver)이 아닙니다”로 표시되지만, 분해 결과 아래의 “이 버전을 뜻했나요?”가 가장 그럴듯한 버전을 보여 줍니다. 앞의 v나 =를 떼어 유효해지면 프리릴리스까지 그대로 두고, 아니면 입력에서 처음 나오는 숫자들을 읽어 빠진 부분을 채웁니다. 버튼을 누르면 그 버전으로 바뀝니다.

1.0.0과 2.0.0-alpha.1의 차이는 왜 major가 아니라 premajor인가요?

2.0.0-alpha.1은 아직 출시되지 않은, 다음 major의 미리보기이기 때문입니다. 두 버전의 major·minor·patch가 다르고 높은 쪽이 프리릴리스이면, 변경 유형은 node-semver의 diff 규칙을 따라 premajor·preminor·prepatch로 — “아직 정식 출시 전인 다음 major의 미리보기” — 표시하고, 지금 설치할 수 있는 호환성 파괴 변경이라고 하지 않습니다. 1.1.0-rc.1과 1.1.0-rc.2처럼 같은 릴리스의 프리릴리스끼리는 여전히 prerelease 변경입니다.