2

我有一个 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

where-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.Toolsdotnet 包分发了一些常用的 proto 文件,所以我annotations.proto在那里复制了它的依赖项(在 macOS 中)并且它起作用了:

`~\.nuget\packages\grpc.tools\2.25.0\build\native\include`

更新:

另一种解决方法:

默认情况下包含项目根目录,因此将其用作基本路径并在那里复制导入的 proto 文件也可以(更好但仍然不理想)。

任何想法如何通过 MSBuild 包含上述自定义目录?

4

1 回答 1

9

终于想通了。正如Jan Tattermusch所建议的那样,ProtoRoot指定 msbuildInclude属性以及 protoimport关键字将从中查找文件的目录,而适用的方式ProtoRootInclude适用于import. 因此,为了将 proto 文件结构自定义为这样,ProtoRoot必须包含所有不同的路径,这些路径应该是:

<Protobuf Include="protos/*.proto" ProtoRoot="./protos; ./protos/googleapis" ... />

更新

以上适用于 v2.31.0 之前的 grpc-dotnet 版本。对于较新的版本,将显示警告ProtoRoot说路径不是路径的前缀Include。要修复它,请改用以下配置:

<Protobuf Include="protos/*.proto" ProtoRoot="protos" AdditionalImportDirs="protos/googleapis" ... />
于 2019-12-30T11:37:02.193 回答