protoc 生成的 grpc 文件和网关文件最终位于不同的路径中?
protoc generated grpc files and gateway files end up in different paths?
我对此有点困惑。文件结构:
/Project
generate.sh
gateway/
cmd/
main.go
pkg/
gatewaypb/
proto/
service.proto
我的 generate.sh
显示为:
set -e
module="github.com/my-org/grpc-project"
// Find all dirs with .proto files in them
for proto in */proto; do
dir=$(echo "$proto"|cut -d"/" -f1)
echo "regenerating generated protobuf code for ${proto}"
protoc --proto_path .\
--go-grpc_out=. --go-grpc_opt=module=${module}\
--go_out=. --go_opt=module=${module}\
"${proto}"/*.proto
echo "creating reverse proxy protobuf code for ${proto}"
protoc -I . --grpc-gateway_out=.\
--grpc-gateway_opt logtostderr=true \
--grpc-gateway_opt paths=source_relative \
"${proto}"/*.proto
done
非常正确,第一个 protoc
符合预期,而第二个则没有。当它们应该在同一路径时,它们会在不同的路径中输出文件。
在运行generate.sh
之后,我还剩下:
/Project
generate.sh
Service/
cmd/
main.go
pkg/
gatewaypb/
*gateway.pb.go
*gateway._grpc.pb.go
proto/
*gateway.pb.gw.go
service.proto
为什么生成的网关文件最终会出现在 proto/
目录中?
我需要给 grpc-gateway-out
什么值,才能像其他生成的 grpc 文件一样在 /pkg/gatewaypb
中结束?
我的 service.proto
文件:
syntax = "proto3";
package gateway.api.v1;
option go_package = "github.com/my-org/grpc-project/gateway/pkg/gatewaypb";
import "google/api/annotations.proto";
message StringMessage {
string value = 1;
}
service YourService {
rpc Echo(StringMessage) returns (StringMessage) {
option (google.api.http) = {
post: "/v1/example/echo"
body: "*"
};
}
}
根据评论,您在生成 protobuf 和 gRPC 文件时使用了模块选项 (--go_opt=module=${module}
& --go-grpc_opt=module=${module}
)。您在生成网关文件时使用的选项 (--grpc-gateway_opt paths=source_relative
) 使用不同的算法来确定文件的存储位置;修复是使用模块选项 - --grpc-gateway_opt module=${module}
.
以下是 the docs 对这三个选项的看法(这些特定选项用于生成 protobuf;其他生成器具有相同的功能,但将 go_
替换为 go-grpc_
/ grpc-gateway_
):
- 默认情况下,输出文件放置在以 Go 包的导入路径命名的目录中。例如,带有上述 go_package 选项的文件 protos/foo.proto 会生成名为 example.com/foo/bar/foo.pb.go.
的文件
- 如果将 --go_opt=module=$PREFIX 标志赋予 protoc,指定的目录前缀将从输出文件名中删除。例如,带有 go_package 选项“example.com/foo/bar”和标志 --go_opt=module=example.com/foo 的文件 protos/foo.proto 会产生一个名为 bar/foo.pb.go.
的文件
- 如果将--go_opt=paths=source_relative标志赋予protoc,则输出文件放置在与输入文件相同的相对目录中。例如,文件 protos/foo.proto 生成名为 protos/foo.pb.go.
的文件
我对此有点困惑。文件结构:
/Project
generate.sh
gateway/
cmd/
main.go
pkg/
gatewaypb/
proto/
service.proto
我的 generate.sh
显示为:
set -e
module="github.com/my-org/grpc-project"
// Find all dirs with .proto files in them
for proto in */proto; do
dir=$(echo "$proto"|cut -d"/" -f1)
echo "regenerating generated protobuf code for ${proto}"
protoc --proto_path .\
--go-grpc_out=. --go-grpc_opt=module=${module}\
--go_out=. --go_opt=module=${module}\
"${proto}"/*.proto
echo "creating reverse proxy protobuf code for ${proto}"
protoc -I . --grpc-gateway_out=.\
--grpc-gateway_opt logtostderr=true \
--grpc-gateway_opt paths=source_relative \
"${proto}"/*.proto
done
非常正确,第一个 protoc
符合预期,而第二个则没有。当它们应该在同一路径时,它们会在不同的路径中输出文件。
在运行generate.sh
之后,我还剩下:
/Project
generate.sh
Service/
cmd/
main.go
pkg/
gatewaypb/
*gateway.pb.go
*gateway._grpc.pb.go
proto/
*gateway.pb.gw.go
service.proto
为什么生成的网关文件最终会出现在 proto/
目录中?
我需要给 grpc-gateway-out
什么值,才能像其他生成的 grpc 文件一样在 /pkg/gatewaypb
中结束?
我的 service.proto
文件:
syntax = "proto3";
package gateway.api.v1;
option go_package = "github.com/my-org/grpc-project/gateway/pkg/gatewaypb";
import "google/api/annotations.proto";
message StringMessage {
string value = 1;
}
service YourService {
rpc Echo(StringMessage) returns (StringMessage) {
option (google.api.http) = {
post: "/v1/example/echo"
body: "*"
};
}
}
根据评论,您在生成 protobuf 和 gRPC 文件时使用了模块选项 (--go_opt=module=${module}
& --go-grpc_opt=module=${module}
)。您在生成网关文件时使用的选项 (--grpc-gateway_opt paths=source_relative
) 使用不同的算法来确定文件的存储位置;修复是使用模块选项 - --grpc-gateway_opt module=${module}
.
以下是 the docs 对这三个选项的看法(这些特定选项用于生成 protobuf;其他生成器具有相同的功能,但将 go_
替换为 go-grpc_
/ grpc-gateway_
):
- 默认情况下,输出文件放置在以 Go 包的导入路径命名的目录中。例如,带有上述 go_package 选项的文件 protos/foo.proto 会生成名为 example.com/foo/bar/foo.pb.go. 的文件
- 如果将 --go_opt=module=$PREFIX 标志赋予 protoc,指定的目录前缀将从输出文件名中删除。例如,带有 go_package 选项“example.com/foo/bar”和标志 --go_opt=module=example.com/foo 的文件 protos/foo.proto 会产生一个名为 bar/foo.pb.go. 的文件
- 如果将--go_opt=paths=source_relative标志赋予protoc,则输出文件放置在与输入文件相同的相对目录中。例如,文件 protos/foo.proto 生成名为 protos/foo.pb.go. 的文件