ローカルにインストールされているツールが想定のバージョンであるかを確認するために、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を使いました。