Protoc v3.12.2 のバージョンの差異
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 になっている。つまり --version
で v3.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 ブランチを使えば揃えられそうなのだが、まぁこちらは試してないのでなんとも。
Discussion