とほほのセマンティックバージョニング入門

目次

セマンティックバージョニングとは

バージョンルール

メジャー・マイナー・パッチバージョン

バージョンを下記の形式で表します。

Major.Minor.Patch

Major, Minor, Patch はそれぞれ、0, 1, 2, 3, ..., 9, 10, 11, ... のような非負整数です。03 のような 0 で始まる数値であってはなりません。Majorメジャーバージョン で、後方互換性のない仕様変更・機能強化を行った場合に増やします。Minorマイナーバージョン で、後方互換性のある仕様変更・機能強化を行った場合に増やします。Patchパッチバージョン で、後方互換性のあるバグ修正を行った場合に増やします。

1.0.0 : 初期バージョン
1.0.1 : バグを修正した
1.1.0 : 機能強化を行った
1.1.1 : 機能強化のバグを修正した
2.0.0 : 互換性を保証できない大きな機能強化を行った

0.y.z は正式リリース前のプロトタイプを示すバージョンで、互換性が失われる機能強化やバグ修正が行われる可能性があります。

0.1.0 : 初期バージョン
0.2.0 : 機能強化及びバグ修正。互換性を失っても Major は 0 のまま

プレリリース・ビルド情報

バージョンの後に、プレリリース情報やビルド情報を付加することができます。

Major.Minor.Patch-PreRelease
Major.Minor.Patch+Build
Major.Minor.Patch-PreRelease+Build

プレリリース情報

PreReleaseプレリリース 情報を示します。ハイフン(-)を含む半角英数文字からなる文字列を指定します。数値のみの場合は 0123 の様な 0 で始まる数値を指定することはできません。

1.2.0-123
1.2.0-0123 ... NG
1.2.0-beta123
1.2.0-beta123-a1
1.2.0-beta123--a1

プレリリース情報はドット(.)で区切って複数指定することができます。

1.2.0-pre1.pre2.pre3
1.2.0-el9.alma.1

ビルド情報

Buildビルド 情報を示します。ハイフン(-)を含む半角英数文字からなる文字列を指定します。数値のみの場合でも 0123 の様な 0 で始まる数値を指定することができます。

1.2.0+123
1.2.0+0123 ... OK
1.2.0+build123
1.2.0+build123-a1
1.2.0+build123--a1

ビルド情報もドット(.)で区切って複数指定することができます。

1.2.0+build1.build2.build3
1.2.0+exp.sha.12345

バージョンの大小比較

バージョンの大小は下記のルールに従います。

バッカス・ナウア記法

バージョンのルールをバッカス・ハウア記法で記述すると次のようになります。

<valid semver> ::=
        <version core>
      | <version core> "-" <pre-release>
      | <version core> "+" <build>
      | <version core> "-" <pre-release> "+" <build>
<version core> ::=
        <major> "." <minor> "." <patch>
<major> ::=
        <numeric identifier>
<minor> ::=
        <numeric identifier>
<patch> ::=
        <numeric identifier>
<pre-release> ::=
        <dot-separated pre-release identifiers>
<dot-separated pre-release identifiers> ::=
        <pre-release identifier>
      | <pre-release identifier> "." <dot-separated pre-release identifiers>
<build> ::=
        <dot-separated build identifiers>
<dot-separated build identifiers> ::=
        <build identifier>
      | <build identifier> "." <dot-separated build identifiers>
<pre-release identifier> ::=
        <alphanumeric identifier>
      | <numeric identifier>
<build identifier> ::=
        <alphanumeric identifier>
      | <digits>
<alphanumeric identifier> ::=
        <non-digit>
      | <non-digit> <identifier characters>
      | <identifier characters> <non-digit>
      | <identifier characters> <non-digit> <identifier characters>
<numeric identifier> ::=
        "0"
      | <positive digit>
      | <positive digit> <digits>
<identifier characters> ::=
        <identifier character>
      | <identifier character> <identifier characters>
<identifier character> ::=
        <digit>
      | <non-digit>
<non-digit> ::=
        <letter>
      | "-"
<digits> ::=
        <digit>
      | <digit> <digits>
<digit> ::=
        "0"
      | <positive digit>
<positive digit> ::=
        "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
<letter> ::=
        "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | "I" | "J"
      | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | "T"
      | "U" | "V" | "W" | "X" | "Y" | "Z" | "a" | "b" | "c" | "d"
      | "e" | "f" | "g" | "h" | "i" | "j" | "k" | "l" | "m" | "n"
      | "o" | "p" | "q" | "r" | "s" | "t" | "u" | "v" | "w" | "x"
      | "y" | "z"

正規表現

バージョンルールの正規表現は次のようになります。Perl, PHP, Python, Go言語に対応しています。仕様書では数字を示す \d を使用していますが、全角文字にもマッチすることがあるため [0-9] を使用しています。

^(?P<major>0|[1-9][0-9]*)\.(?P<minor>0|[1-9][0-9]*)\.(?P<patch>0|[1-9][0-9]*)(?:-(?P<prerelease>(?:0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9][0-9]*|[0-9]*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+(?P<buildmetadata>[0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$