理系学生日記

おまえはいつまで学生気分なのか

Semantic VersioningをGolangで扱う

ローカルにインストールされているツールが想定のバージョンであるかを確認するために、Golangでチェックを入れることになりました。昨今のツールの多くはSemantic Versioningをサポートしているので、Semantic Versioningで比較したい。

しかし、Semantic Versioningをいざ比較しようとすると大変に面倒です。.で分割すれば良いかというとそうではありません。

上述のサイトを例にとると、1.0.0-alpha < 1.0.0-alpha.1 < 1.0.0-alpha.beta < 1.0.0-beta < 1.0.0-beta.2 < 1.0.0-beta.11 < 1.0.0-rc.1 < 1.0.0です。

では、1.0.0-beta+exp.sha.5114f85はこの不等式のどこに入るでしょうか。

そういったことを考え出すと大変につらくなるので、この手のものはライブラリを使いましょう。

以下の2つともに、バージョン制約を記述する上では非常に使いやすいものでした。ライセンスは前者がMIT、後者がMPL2。

こちらはgo-versionのサンプルコードですが、このあたりのInterfaceはMasterminds/semverでも同様で、インポートするライブラリを切り替えればどちらでも通用します。

v1, err := version.NewVersion("1.2")

// Constraints example.
constraints, err := version.NewConstraint(">= 1.0, < 1.4")
if constraints.Check(v1) {
    fmt.Printf("%s satisfies constraints %s", v1, constraints)
}

どちらを使っても良かったといえば良かったのですが、今回のバージョン比較対象がTerraformだったので、 Terraformの中で使われているgo-versionを使いました。