【问题标题】:Using Grpc.Tools with Protoc plug-in to generate additional C# files使用带有 Protoc 插件的 Grpc.Tools 生成额外的 C# 文件
【发布时间】:2021-07-21 18:24:20
【问题描述】:

我正在使用 Grpc.Tools (2.38.1) 从包含一些服务定义的 Test.proto 文件生成 C# 类型和 gRPC 存根。

为此,我在项目的.csproj 文件中有以下内容:

<ItemGroup>
    <Protobuf Include="**/*.proto" />
</ItemGroup>

一切正常:我的Test.proto 在我的项目的 obj/Debug 文件夹中编译为 Test.csTestGrpc.cs。它们中的类型可以从项目中的其他类型中引用。

但我也需要为服务创建一个 WCF 接口,所以我想我可以使用自定义 Protoc 插件生成它。所以我写了一个简单的Protoc插件,写出一个包含接口的TestWcf.cs文件。然后,我将此插件可执行文件放在名为protoc-gen-blah.exe 的路径上,并将.csproj 文件中的条目更新为:

<ItemGroup>
    <Protobuf Include="**/*.proto" AdditionalProtocArguments="--blah_out=obj\Debug" />
</ItemGroup>

这会正确创建 C# 文件 TestWcf.cs,我的界面位于:fantasy。

问题是我在TestWcf.cs 中的接口不能被项目中的其他类型引用,除非我在项目中手动包含生成的文件:这与其他生成的文件无关。

虽然默认情况下项目中不包含任何文件——我必须启用“显示所有文件”才能看到它们——Test.csTestGrpc.cs 在解决方案资源管理器中旁边有箭头,可以展开它们揭示里面的类型。 TestWcf.cs 没有这个箭头。所以 Visual Studio 不知何故知道Test.csTestGrpc.cs 是源代码文件。

有谁知道我需要做什么才能像其他两个文件一样被 Visual Studio 自动识别生成的文件?

我怀疑它与this part of the Grpc.Tools build target 有关,因为我注意到我的TestWcf.cs 文件也不包含在 Grpc.Tools 清理删除的文件中,但我不明白为什么它不考虑我的生成的文件为 C#。

当我构建时,这是 Protoc 调用:

D:\...\Src\packages\Grpc.Tools.2.38.1\tools\windows_x86\protoc.exe --csharp_out=obj\Debug ⤶
--plugin=protoc-gen-grpc=D:\...\Src\packages\Grpc.Tools.2.38.1\tools\windows_x86\grpc_csharp_plugin.exe ⤶
--grpc_out=obj\Debug --proto_path=D:\...\Src\packages\Grpc.Tools.2.38.1\build\native\include ⤶
--proto_path=. --dependency_out=obj\Debug\xxxx_Test.protodep --error_format=msvs --blah_out=obj\Debug ⤶
Test.proto

依赖文件如下所示:

obj\Debug/Test.cs \
obj\Debug/TestGrpc.cs \
obj\Debug/TestWcf.cs: Test.proto

谢谢。

【问题讨论】:

    标签: c# grpc


    【解决方案1】:

    我认为问题是由 Grpc.Tools 中的some logic 引起的,它会通知 MSBuild 已生成的文件:

    public override string[] GetPossibleOutputs(ITaskItem protoItem)
    {
        ...     
        var outputs = new string[doGrpc ? 2 : 1];
        ...
        outputs[0] = Path.Combine(outdir, filename) + ".cs";
    
        if (doGrpc)
        {
            ...
            outputs[1] = Path.Combine(grpcdir, filename) + "Grpc.cs";
        }
        return outputs;
    }
    

    此代码仅适用于从协议缓冲区源 (name.proto) 生成的两个文件:协议缓冲区代码生成 (name.cs) 和 gRPC 代码生成 (nameGrpc.cs)。它没有拾取附加文件并通知 MSBuild 它存在,因此 Visual Studio 不认为它是代码。

    除了更改 Grpc.Tools 代码之外,别无选择。

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 1970-01-01
      • 2022-06-10
      • 2021-02-07
      • 2020-02-05
      • 2015-09-10
      • 1970-01-01
      • 1970-01-01
      • 2022-01-25
      相关资源
      最近更新 更多