我有一个dotnet核心gRPC项目,并且尝试在我的原型文件中包含路由注释,如下所示:
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
为编译器提供了dir,可以在其中找到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软件包分发了一些常用的原始文件,因此我annotations.proto
在macOS中复制了它的依赖项并在其中工作:
`~\.nuget\packages\grpc.tools\2.25.0\build\native\include`
更新:
另一个解决方法:
默认情况下包括项目根目录,因此将其用作基本路径并在其中复制导入的原始文件也可以(更好,但仍然不理想)。
任何想法如何通过MSBuild包含上述自定义目录?
终于想通了。正如Jan Tattermusch所建议的那样,ProtoRoot
指定将从中查找msbuildInclude
属性以及protoimport
关键字的目录,而其工作方式与ProtoRoot
工作方式Include
不同import
。因此,为了像这样自定义原始文件结构,ProtoRoot
必须包含所有不同的路径,这些路径应为:
<Protobuf Include="protos/*.proto" ProtoRoot="./protos; ./protos/googleapis" ... />
更新内容:
对于v2.31.0之前的grpc-dotnet版本,上述工作正常。对于较新的版本,将显示警告,指出ProtoRoot
path不是path的前缀Include
。要解决此问题,请改用以下配置:
<Protobuf Include="protos/*.proto" ProtoRoot="protos" AdditionalImportDirs="protos/googleapis" ... />
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句