セマンティックバージョニング (SemVerとも呼ばれる)は、プログラムやライブラリのバージョンを操作するための一般的なアプローチになりました。 これにより、後続のリリースでの作業が容易になるだけでなく、人々や自動化がこれらのリリースの相互の互換性や世界全体との互換性を理解できるようになります。 SemVerは多くの場所で使用できますが、このアプローチは依存関係管理システムで最もよく知られています。
Go固有のことについて話す前に、セマンティックバージョニングとは何かを見てみましょう(翻訳者のメモ:この部分のために翻訳が開始されました)。
この図は、バージョン文字列のセマンティック部分を示しています。 ほとんどの場合、ドット「。」で区切られた最初の3桁のみが表示されます。 。 完全にセマンティックなバージョンは、次の部分で構成されます。
- 「メジャー」バージョン番号。 ライブラリまたはアプリケーションAPIが後方互換性のない方法で変更されると、増加します(常に1ではありませんが、PHP 5-> 7を思い出してください)。
- 「マイナー」バージョン番号。 下位互換性を損なうことなく新しい関数がAPIに追加されると増加します(翻訳者のメモ:これは最悪の部分です。たとえば、デフォルトでnpmはプレフィックスを「^」、つまり「同じメジャーを持つ任意のバージョン」で保存します。Npmマイナー:マイナーバージョンを変更してもマイナー互換性が失われない場合は、更新しても安全です。多くのライブラリ開発者は、セマンティックバージョニングが何であるかを知らず、後方互換性が機能しません。 t、および「ゼロから」別のコンピューターにインストールすると、下位互換性が壊れた新しいバージョンの依存関係が取得されます)。 「メジャー」の数を増やす場合、「マイナー」を0にリセットするのが慣習です。つまり、バージョン4.27 ...の後にはバージョン5.28ではなく、バージョン5.0 ...が続きます。
- 「パッチ」バージョン番号。 バグ、リファクタリング、およびその他の変更を加えて、何も壊さないが、新しい機能を追加しない場合に増加します。 「メジャー」または「マイナー」を増やす場合、「パッチ」を0にリセットするのが慣習です(翻訳者の注記:「ビルド番号」と呼ばれることが多く、リセットすることなく、継続的な統合ビルドごとに1ずつ増やすだけです。これにより、ビルドとユーザーからのエラーメッセージのテストおよび分析中の友人。このアプローチのマイナスは、すぐに数字が5桁になることですが、これはそれほど気にしません)。
- プレリリース文字列:オプションのドット付きリスト。マイナス記号で3つのバージョン番号から区切られています。 例: 「1.2.3-beta.2」 開発の特定のマイルストーンを「タグ付け」するために、タグの代わりに使用されます。 通常、これらは「アルファ」、「ベータ」、「リリース候補」(「rc」)およびそれらの派生物です。
- ビルドシステムのメタデータのセマンティックバージョンの行を完了します。 「プレリリース」タグのリストと同様に、ドットで区切られています。 、ただし、マイナスではなく、数字やタグから分離するプラスです。 この情報を無視するのが通例です(翻訳者の注意:ビルド番号はFeng Shuiによってここに送られるべきです-しかし、これを行うものはほとんどなく、非常に長い行が得られます)。
仕様では接頭辞「v」について何も言われていないという事実にもかかわらず、セマンティックバージョンの行の前に使用されることがよくあります。例えば、 「v.12.3」などです。 メタデータと同様に、それを無視するのが習慣です。
これらすべておよびその他の詳細は、公式仕様書に記載されています: http : //semver.org/
綿密に設計された仕様のおかげで、セマンティックバージョンの行は簡単に解析、ソートでき、最も重要なことには、相互および「有効な」バージョンの範囲と比較できます。 実際、これは、npmなどのほとんどの依存関係マネージャーが行うことです。
Goでのセマンティックバージョンの解析
Goには、いくつかのセマンティックバージョン管理パッケージが用意されています。 この記事では、これを検討します: github.com/Masterminds/semver 仕様に準拠し、オプションの接頭辞「v」をサポートし、ソート、範囲および制限の操作を行います。 ただし、このパッケージは制限付きで、JavaScript、Rustなどの他のプログラミング言語のほとんどのソリューションと同じように機能します。
以下の例は、セマンティックバージョンの行を解析し、「メジャー」バージョンまたはエラーメッセージを表示します。
v, err := semver.NewVersion("1.2.3-beta.1+build345") if err != nil { fmt.Println(err) } else { fmt.Println(v.Major()) }
戻り値は、多数の便利なメソッドを含むsemver.Versionのインスタンスです。 渡された文字列がセマンティックバージョンではない場合、 semver.ErrInvalidSemVerエラーが返されます。
ただし、このライブラリの本当の利点は、文字列を解析する機能ではなく、セマンティックアクションで複雑なアクションを実行できることです。
セマンティックバージョンの並べ替え
semverライブラリを使用すると、標準ライブラリを使用してセマンティックバージョンをソートできます。 例:
raw := []string{"1.2.3", "1.0", "1.0.0-alpha.1" "1.3", "2", "0.4.2",} vs := make([]*semver.Version, len(raw)) for i, r := range raw { v, err := semver.NewVersion(r) if err != nil { t.Errorf("Error parsing version: %s", err) } vs[i] = v } sort.Sort(semver.Collection(vs))
この例では、セマンティックバージョンのセットがsemver.Versionのインスタンスに変換され、次にsemver.Collectionに追加されます 。 Semver.Collectionには、標準のソートライブラリで使用するために必要なものがすべて揃っています。 これは、プレリリース情報を正しくソートし、メタタグを無視するのに非常に便利です。
範囲、制限、ワイルドカード
最も一般的なバージョンの質問の1つは、バージョンが指定された範囲内にあるかどうかを確認することです。 または、他のいくつかの制限を満たしますか。 これらのチェックはすべて、ライブラリを使用して簡単に実行できます。
c, err := semver.NewConstraint(">= 1.2.3, < 2.0.0, != 1.4.5") if err != nil { fmt.Println("Error parsing constraint:", err) return } v, err := semver.NewVersion("1.3") if err != nil { fmt.Println("Error parsing version:", err) return } a := c.Check(v) fmt.Println("Version within constraint:", a)
他の言語およびツールのバージョン範囲に精通している人のために、ライブラリはよく知られた表記法を提供します:
- ^ 1.2.3は、「メジャー」バージョンレベルでの互換性を示します。 これは、 「> = 1.2.3、<2.0.0」を記述するための構文シュガーです。 「APIと互換性がある依存関係の最新バージョン」を示すために使用されます。
- 〜1.2.3は、パッチレベルでの互換性を示します。 これは、 「> = 1.2.3、<1.3.0」の構文糖衣です。 目的のバージョンを示すために、最新のバグ修正を使用しますが、大きな変更はありません。
- 「1.2.3-3.4.5」は、開始と終了を含むバージョンの正確な範囲を示します。 これは、 「> = 1.2.3、<= 3.4.5」の構文糖衣です。
- ライブラリは、文字「x」 、 「X」、または「*」を使用した「ワイルドカード」もサポートしています。 バージョンを「2.x」 、 「1.2.x」、または「*」として指定できます。 そして、これらすべての表記法は、互いに安全に組み合わせることができます。