背景
protobufのバージョンを見ると、
- 3.29.5
- 6.31.1
のような小さなケースと、
- 29.5
- 31.1
のような非常に大きなものが分散しています。
https://github.com/protocolbuffers/protobuf/tags
どのバージョンを使えば良いのか理解できるよう説明します。
バージョン管理スキーム
課題
一般にバージョン「3.21.7」の場合、「3」はメジャーバージョン、「21」はマイナーバージョン、「7」はマイクロバージョンまたはパッチ番号を表します。
protobufの場合色んな言語を対象とするので、「一部の言語だけ API を壊す変更を入れたいのに、全言語いっせいに 4.0 にするのはつらい」といった課題がありました。
https://protobuf.dev/support/version-support/
解決方法
そこで v20.x protoc リリース以降、Protocol Buffers の言語固有の部分への迅速なアップデートを可能にするため、バージョン管理スキームを変更しました。
各言語に独自のメジャーバージョンが割り当てられ、他の言語とは独立してインクリメントできます。ただし、マイナーバージョンとパッチバージョンは連動させます。
具体例
- 31.x 系タグ(v31.0, v31.1…)
- protoc 本体(C++ コード)のバージョン
- 3.31.x / 4.31.x など
- 頭の
3/4/5/6が 言語ごとのランタイムメジャーバージョン- 3 系: C#, PHP など旧 API のまま
- 4 系: Java, Ruby など 2024Q1 に breaking change 済み
- 5 系: C++ 2024Q1〜, 6 系: Python 2025Q1〜 … と順次上がっている
- 真ん中の
31.xは 対応する protoc本体のバージョン
- 頭の
言語別メジャーバージョン対応表
以下は2025年6月時点での各言語の最新メジャーバージョンです(v31.x系での例):
| 言語 | メジャーバージョン | パッケージ名の例 | 備考 |
|---|---|---|---|
| C++ | 5.31.x | protobuf:5.31.1 | 2024Q1に4→5へ |
| Java | 4.31.x | protobuf-java:4.31.1 | 2024Q1に3→4へ |
| Python | 6.31.x | protobuf:6.31.1 | 2025Q1に5→6へ |
| C# | 3.31.x | Google.Protobuf:3.31.1 | まだ3系を維持 |
| Go | - | google.golang.org/protobuf | 独自バージョニング(v1.x.x) |
| JavaScript | 3.31.x | google-protobuf:3.31.1 | まだ3系を維持 |
| PHP | 4.31.x | google/protobuf:3.31.1 | 2024Q1に3→4へ |
| Ruby | 4.31.x | google-protobuf:4.31.1 | 2024Q1に3→4へ |
| Objective-C | 3.31.x | Protobuf-C++:3.31.1 | まだ3系を維持 |
| Swift | - | SwiftProtobuf | 独自バージョニング |
注意点: - Goは独自のセマンティックバージョニング(v1.x.x)を採用し、protocバージョンとは独立 - Swiftも同様に独自バージョニングを使用
いつから変わったか
- 旧スキーム (3.x.y) は 2022/03リリースの 3.20.x 系列まで。
- 新スキーム (v21 以降) は 2022/05にポリシー変更を発表し、v21.0 正式リリースからスタート。
ざっくりの年表は以下です。
| 年月 | リリース | 位置づけ | ポイント |
|---|---|---|---|
| 2022-03 | 3.20.x | 旧 3 系列の最終版 | まだ “3.**” 表記 |
| 2022-05-06 | 仕様変更発表 | ポリシー文書で新バージョニングを告知 | 各言語ごとに major を自由に上げられるようにしたと説明 (protobuf.dev) |
| 2022-05-25 | v21.0 | 新スキーム最初の安定版 | ここから “真ん中の数字” が 21 に飛ぶ (protobuf.dev) |
| 2023-02-16 | v22.0 | 2 回目 (四半期リズム確立) | Maven RC 命名変更など (protobuf.dev) |
| 2023-11-01 | v25.0 | 5 回目 | Python UnknownFields 非推奨など (protobuf.dev) |
| 2024-03-13 | v26.0 | 6 回目 | 主要ランタイムに破壊的変更 (protobuf.dev) |
| 2024-11-27 | v29.0 | 9 回目 | Bazel 周りの大幅整理 (protobuf.dev) |
| 2025-03-04 | v30.0 | 10 回目 (現行の大きな区切り) | Editions 関連の破壊的変更を多く含む (protobuf.dev) |
その他
Bazel の protobuf はコンパイラとランタイムどちらを指定すべき?
Bazelでは
bazel_dep(name = "protobuf", version = "31.1")
のようにコンパイラの方を指定します。
Bazel Central Registryもそちらを管理しています。

ref: https://registry.bazel.build/modules/protobuf
まとめ
protobuf のバージョン管理スキームを課題背景から説明し、なぜこのような形になったかを説明しました。