我有一个dotnet core gRPC项目,想要在我的proto文件中包含路由注释,就像下面这样:
import "google/api/annotations.proto";
文件结构是这样的(因为我将
googleapis
存储库作为git子模块导入):protos/
myproto.proto
googleapis/
google/
api/
annotations.proto
...
在Go项目中,可以通过以下方式完成:
protoc -I . -I ./googleapis --go_out=plugins=grpc:. *.proto
-I ./googleapis
参数告诉编译器可以在这个目录下找到annotations.proto
文件及其依赖。
但是,在使用以下配置的dotnet grpc项目中使用MSBuild时,我无法弄清楚如何包含自定义目录。
<ItemGroup>
<Protobuf Include="protos/*.proto" GrpcServices="Server" />
</ItemGroup>
官方文档提到了一种替代方案来自定义目标构建,以便我可以使用protoc
:
protoc --plugin=protoc-gen-grpc=$(gRPC_PluginFullPath) -I $(Protobuf_StandardImportsPath) ...
但是上面的命令忽略了服务定义并且没有生成服务器存根代码,正如这里所述,而MSBuild可以。
我找到了一个解决方法,但并不理想:
我意识到
Grpc.Tools
dotnet包分发了一些常用的proto文件,所以我将annotations.proto
及其依赖项复制到了那里(在macOS上),然后它就起作用了:`~\.nuget\packages\grpc.tools\2.25.0\build\native\include`
更新:
另一种解决方法:
默认情况下会包含项目根目录,因此将其用作基本路径并将导入的proto文件复制到那里也可以(更好但仍然不理想)。
有什么想法可以通过MSBuild包含类似上面的自定义目录吗?
--grpc_out=OUT_DIR
。 - Jan Tattermuschprotos/myproto.proto
和protos/google/api/annotations.proto
(不包括“googleapis”目录,因为“google/api”需要对应于annotations.proto的命名空间),然后一切都应该能够正常构建。 - Jan Tattermusch