繁体   English   中英

使用 Grpc.Tools 和 Protoc 插件生成额外的 C# 文件

[英]Using Grpc.Tools with Protoc plug-in to generate additional C# files

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

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

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

这是所有工作的罚款:我Test.proto被编译到Test.csTestGrpc.cs在我的项目的OBJ / Debug文件夹中。 它们中的类型可以从项目中的其他类型中引用。

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

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

这正确地创建了 C# 文件TestWcf.cs ,我的界面在:太棒了。

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

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

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

我怀疑它与Grpc.Tools 构建目标的这一部分有关,因为我注意到我的TestWcf.cs文件也不包含在 Grpc.Tools clean 删除的文件中,但我不明白为什么会这样不要认为我生成的文件是 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

谢谢。

我相信这个问题是由 Grpc.Tools 中的一些逻辑引起的, 这些逻辑通知 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 代码之外,没有其他办法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM