Protoc v3.12.2 のバージョンの差異

公開:2020/09/17
更新:2020/09/17
2 min読了の目安(約1200字TECH技術記事

https://github.com/protocolbuffers/protobuf/releases/tag/v3.12.2 で配布されてるバイナリを --version でバージョンを確認すると v3.12.1 になる。

$ ./3.12.2/bin/protoc --version
libprotoc 3.12.1

他のバージョンは protoc と libprotoc で同じものにリンクしているので、まぁなにかしらビルドの都合(不具合)だろうってことでそれはそれでわかる。

しかし alpinelinux v3.12 でインストールした protoc v3.12.2 は libprotoc v3.12.2 になっている。つまり --versionv3.12.2 が表示される。

このこと(protoc v3.12.2 が libprotoc v3.12.2 にリンクしていること)は alpinelinux のパッケージサイト で確認できる。

これで何が困るかというと protoc-gen-go プラグインが最近生成したコードに protoc のバージョンを含めるようになった。そのため Docker イメージでよく使われる alpinelinux ベースの protoc v3.12.2 と公式が配布しているそれでは同じバージョンなのに、コメント部分だけとは言え生成されるコードに差異ができてしまう。protocの実行をDockerに頼ってるケースと、公式バイナリに頼ってるケースで差異がでてしまったというわけだ。

解決方法としては公式の v3.12.3 以降を使えば良いのだが、alpinelinux に用意されているパッケージは v3.12.2 であり差分が生じてしまうことに変わりはない。とりあえず自分は公式の v3.12.3 で生成後に以下のスクリプトを実行してバージョン情報を書き換えるようにした。

$ grep -lr '//\s*protoc\s*v3\.12\.3' . | xargs sed -i -e 's!\(//\s*protoc\s*v3\.12\)\.3!\1.2!g'

そのほかの解決方法として公式の v3.13.0 を使い、alpinelinux の edge ブランチを使えば揃えられそうなのだが、まぁこちらは試してないのでなんとも。