以下の内容はhttps://christina04.hatenablog.com/entry/protobuf-version-schemeより取得しました。


protobuf のバージョン管理スキームを理解する

背景

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 のバージョン管理スキームを課題背景から説明し、なぜこのような形になったかを説明しました。

参考




以上の内容はhttps://christina04.hatenablog.com/entry/protobuf-version-schemeより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14