我正在将使用 protoc 的 PHP 项目迁移到 Buf CLI。为了确保向后兼容性,我试图让 Buf 产生与内置 PHP 插件或多或少完全相同的输出。 我已将
buf.gen.yaml
配置为使用 protoc_builtin: php
作为目标插件,并省略了任何选项,因为 protoc 之前也没有接受任何参数。
当我运行
buf generate
时,但 GPBMetadata 二进制文件现在位于错误的目录中。 protoc 将它们放在输出顶层的目录中,复制目录结构(甚至不是包路径,只是目录)。
这是我的目录结构:
src
| users
| user.proto
| items
| user_item.proto
这是我的配置:
version: v2
managed:
enabled: true
inputs:
- directory: .
paths:
- src
plugins:
- protoc_builtin: php
out: buf_out
运行
buf generate
(使用上述配置)会产生以下输出:
buf_out
| Users
| User.php
| Metadata
| User.php
| Items
| UserItem.proto
| Metadata
| UserItem.php
运行
protoc -I=. php_out=builtin_out $(find src -type f -name '*proto')
会产生这样的结果:
builtin_out
| Metadata
| Users
| User.php
| Items
| User_item.proto
| Users
| User.php
| Items
| User_item.proto
还要注意蛇形转换的差异。显然,Buf 所做的事情比它的文档告诉我们的要多。
Buf 是否有任何标志可以让我恢复到协议行为。或者我不知何故版本错误? (顺便说一句,使用 1.45.0)
您需要关闭托管模式才能获得与 protoc 及其内置插件相同的行为。
在托管块内的
buf.gen.yaml
中设置enabled: false
或完全删除该块。