用<Generator>调用NuGet包中的工具,出现意外的“找不到”错误

时间:2019-10-15 01:20:37

标签: c# .net-core protocol-buffers

在.NET Core 3.0项目中,我已经安装了Google.Protobuf.Tools

<PackageReference Include="Google.Protobuf" Version="3.10.0" />
<PackageReference Include="Google.Protobuf.Tools" Version="3.10.0" />

应使用protoc二进制文件

C:\Users\jdphe>dir %USERPROFILE%\.nuget\packages\google.protobuf.tools\3.10.0\tools\windows_x64
 Volume in drive C has no label.
 Volume Serial Number is 967E-3D8C

 Directory of C:\Users\jdphe\.nuget\packages\google.protobuf.tools\3.10.0\tools\windows_x64

10/14/2019  07:36 PM    <DIR>          .
10/14/2019  07:36 PM    <DIR>          ..
10/02/2019  06:08 PM         3,611,120 protoc.exe
              1 File(s)      3,611,120 bytes
              2 Dir(s)  152,718,581,760 bytes free

但是,当尝试在我的csproj中使用protoc标签调用<Generator>时,

<None Update="Person.proto">
  <Generator>$(NugetPackageRoot)google.protobuf.tools\3.10.0\tools\windows_x64\protoc.exe --csharp_out=Model Person.proto</Generator>
</None>
  

未找到生成器'C:\ Users \ jdphe.nuget \ packages \ google.protobuf.tools \ 3.10.0 \ tools \ windows_x64 \ protoc.exe --csharp_out = Model Person.proto'。请验证名称。

我已经确认命令可以从命令行的项目文件夹中按预期运行

  

C:\ Users \ jdphe \ source \ repos \ Phenix.Protobufconcat \ Phenix.Protobufconcat>%USERPROFILE%.nuget \ packages \ google.protobuf.tools \ 3.10.0 \ tools \ windows_x64 \ protoc.exe --csharp_out =模型Person.proto

我可能不了解<Generator>标签应该如何工作,但是我不确定。

2 个答案:

答案 0 :(得分:0)

尝试:

<PackageReference Include="Google.Protobuf.Tools" Version="3.10.0">
  <PrivateAssets>all</PrivateAssets>
  <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>

答案 1 :(得分:0)

根据您的错误消息,找不到Person.proto。尝试使用完整的路径。这可能有效:

$(NugetPackageRoot)google.protobuf.tools\3.10.0\tools\windows_x64\protoc.exe --csharp_out=$(ProjectDir)Model $(ProjectDir)Person.proto 

此外,另一种选择(如果您使用的是Visual Studio 2019,则似乎使用的是)是使用MSBuild预构建事件。我在答案here中列出了一个可行的解决方案。