セマンティックバージョニング
- 2023年10月02日
- CATEGORY- 1. 技術力{技術情報}
Go言語プロジェクトでのセマンティックバージョニングの採用とそのメリット
はじめに
前回はGo言語プロジェクトでのChangelogの管理について、特にコンベンショナルコミットとの連携を中心に解説しました。今回はその続きとして、セマンティックバージョニングについて解説します。
セマンティックバージョニングとは
セマンティックバージョニングは、ソフトウェアのバージョンを明示的かつ一貫性を持って管理する方法論です。基本の形は MAJOR.MINOR.PATCH
となっており、それぞれの数字が特定の意味を持っています。
各バージョン番号の意味
- MAJOR: 互換性がないAPIの変更がある場合にインクリメント
- MINOR: 互換性があり、新機能が追加された場合にインクリメント
- PATCH: 互換性があり、バグが修正された場合にインクリメント
Go言語でのセマンティックバージョニング
Go言語はモジュールの管理にもセマンティックバージョニングが広く採用されています。Goのパッケージ管理ツールであるgo mod
でも、このバージョニング方法がフルサポートされています。
具体的な実例: Goプロジェクトにおけるバージョン変更
Go言語において以下のような変更があったとしましょう。
変更前のGoコード(v1.0.0)
package main
func Add(a int, b int) int {
return a + b
}
func main() {
result := Add(3, 4)
println(result)
}
新機能を追加(MINORバージョンアップ: v1.1.0)
package main
// この関数は新機能です。
func Multiply(a int, b int) int {
return a * b
}
func Add(a int, b int) int {
return a + b
}
func main() {
result := Add(3, 4)
println(result)
newResult := Multiply(3, 4)
println(newResult)
}
バグ修正(PATCHバージョンアップ: v1.1.1)
package main
func Multiply(a int, b int) int {
return a * b
}
// この関数はバグ修正がされました。
func Add(a int, b int) int {
if a < 0 || b < 0 {
return 0
}
return a + b
}
func main() {
result := Add(3, 4)
println(result)
newResult := Multiply(3, 4)
println(newResult)
}
破壊的変更(MAJORバージョンアップ: v2.0.0)
package main
func Multiply(a int, b int) int {
return a * b
}
// この関数は破壊的変更がされました。
func Add(a, b, c int) int {
return a + b + c
}
func main() {
result := Add(3, 4, 5)
println(result)
newResult := Multiply(3, 4)
println(newResult)
}
短い例で機能追加と破壊的変更の例を作るのが難しくて、ちょっと無理やり感ありますが、雰囲気で理解していただくとして・・・。破壊的変更が無い限り、いくら機能追加してもメジャーバージョンは上がらないよというのが原則ですね。
go-semantic-releaseの活用
前回の記事で紹介したgo-semantic-release
を用いると、セマンティックバージョニングに基づいたリリースとChangelogの生成が自動化できます。
# バージョンを自動でインクリメントしてタグを付ける
go-semantic-release -ghr
セマンティックバージョニングのメリット
- 明確性: バージョン番号だけで、そのバージョンで何が変わったのかが一目でわかる。
- 自動化の容易性: バージョン管理とChangelog生成を一元的に自動化できる。
参考リンク
まとめ
セマンティックバージョニングは、Go言語プロジェクトにおいても多くのメリットをもたらします。特に、コンベンショナルコミットとの連携により、バージョン管理とChangelog生成を効率よく行うことが可能です。
- 2023年10月02日
- CATEGORY- 1. 技術力{技術情報}