为所有解决方案共享一个 gRPC 原型文件

Lic*_*tia 10 c# grpc-c#

我最近在 .net core 上接触了 gRPC,到目前为止我对此非常满意。

我遇到的唯一问题是 proto 文件,例如:如果我在 grpc 服务器解决方案中对 MyProtos.proto 文件进行更改。我必须更新所有客户端解决方案中的 MyProtos.proto 文件。

所以我想知道是否有办法共享原型文件..

我尝试创建一个单独的解决方案并将原型文件放在那里,然后将其引用到所有其他解决方案,但无法使其工作。

Art*_*tur 20

您可以使用 nuget 包分发 proto 文件。使用.nuspecfile来打包文件。例如,如果您的*.proto文件位于proto文件夹下My.Server.Proto.nuspec,则可能如下所示:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2013/05/nuspec.xsd">
  <metadata>
    <id>My.Server.Proto</id>
    <version>1.0.0</version>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>My Server Proto Files</description>
    <authors>My Company Ltd.</authors>
  </metadata>
  <files>
    <file src="proto/**/*.proto" />
  </files>
</package>
Run Code Online (Sandbox Code Playgroud)

然后在要使用文件的项目中,安装 grpc 依赖项

<ItemGroup>
  <PackageReference Include="Google.Protobuf" Version="3.14.0" />
  <PackageReference Include="Grpc.Tools" Version="2.34.0">
    <PrivateAssets>all</PrivateAssets>
    <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  </PackageReference>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

安装你的原型包:

<ItemGroup>
  <PackageReference Include="My.Server.Proto" Version="1.0.0" GeneratePathProperty="true" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

请注意GeneratePathProperty="true". 这将允许您引用 nuget 安装文件夹。现在添加Protobuf项目

<ItemGroup>
  <Protobuf Include="$(PkgMy_Server_Proto)/proto/**/*.proto" ProtoRoot="$(PkgMy_Server_Proto)" GrpcServices="Client" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

$(PkgMy_Server_Proto)变量将解析到My.Server.Protonuget 文件夹。变量名以 开头Pkg,后面是包名(当.替换为时) _