【问题标题】:DotNet Core Create Proto message common libraryDotNet Core 创建 Proto 消息公共库
【发布时间】:2021-04-15 17:57:46
【问题描述】:

用例非常简单: 我有两个项目(ProtoProvider 和 ProtoConsumer)。

ProtoProvider 有 proto 文件 (to_import.proto) 和我想在 ProtoConsumer 上使用的消息。
ProtoConsumer 对 ProtoProvider 有一个引用,并尝试在imported.proto 中使用ProvidedMessage。 我无法使用该消息,因为我收到“找不到文件”。在 import.proto 的编译器上导入和“ProvidedMessage 未定义”。
EDIT2>>> 为了澄清我想创建一个像谷歌的 google.protobuf.Timestamp 这样的消息并将其分发到另一个项目或没有其他项目的项目,同时让项目/项目(消费者)从 dll 获取消息。问题的整个前提是如何通过dll在另一个项目中使用to_import.proto中定义的消息(将其视为common.grpc lib)。


EDIT1>>> 我收到的错误消息

是否有允许从项目引用中导入 proto 文件的解决方案? 我正在寻找类似谷歌的知名类型解决方案

import "google/protobuf/timestamp.proto";
import "google/protobuf/empty.proto";

来源:https://developers.google.com/protocol-buffers/docs/csharptutorial#where-to-find-the-example-code.
(复制原始文件或移动文件不是一个优雅的解决方案)。

下面我将提供 .csproj 文件

ProtoProvider:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <None Remove="to_import.proto" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.27.0" />
  </ItemGroup>

  <ItemGroup>
    <Protobuf Include="to_import.proto" GrpcServices="None" />
  </ItemGroup>

</Project>

原始消费者:

    <Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Protobuf Include="Protos\imported.proto" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Grpc.AspNetCore" Version="2.27.0" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\ProtoProvider\ProtoProvider.csproj" />
  </ItemGroup>
</Project>

编辑>>3 一些上下文:这个问题的目的是帮助我理解一种更清晰的方式来实现小数一次(如指定here)并在每个项目中重用它们。

【问题讨论】:

  • 我不明白你的问题。提供者和消费者可以使用相同的proto 文件。您声明您的消息并编译为本机代码。您导入的本机代码。我不明白您搜索“知名”类型。
  • 所以在构建时您没有收到 File not found 错误?我正在使用错误消息更新原始帖子
  • 我没有使用 C#,但我现在明白了。您是否检查过您的导入语法以确保它是正确的(包名称等)?您的 csharp 命名空间不包含“common”。
  • 这就是我感兴趣的发现,如何正确导入。我尝试了许多不同的包+原型文件名、包+类名、命名空间+原型文件名和命名空间+类名的组合。所有这些都会导致找不到文件错误。
  • 如果 C# 环境与 Java 环境完全一样,csharp_namespace 应该是完全限定路径名的前缀/路径/目录,而不是 ProtoConsumer。你看到这个了吗? stackoverflow.com/questions/64547422/…

标签: .net-core grpc proto protocol-buffers


【解决方案1】:

AFAIK,编译 proto 文件需要所有文件(包括导入)都存在于磁盘上。

这适用于众所周知的类型的方式是它们包含在Grpc.Tools nuget package 中。

所以不可能发布一个类库来完成你想要的。

对相关grpc-dotnet issue 的讨论建议使用以下组合:

  • 构建一个包含通用原型和相关类库的 nuget 包
  • 在使用代码的包引用中,使用GeneratePathProperty 生成一个变量,该变量保存到 nuget 包内容的路径
  • 在消费代码的Protobuf Include 中,使用AdditionalImportDirs 包含来自nuget 包的通用原型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-06
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    相关资源
    最近更新 更多