如何从生成的文件夹中删除自动生成的 proto 文件

Posted

技术标签:

【中文标题】如何从生成的文件夹中删除自动生成的 proto 文件【英文标题】:how to remove auto generated proto files from generated folder 【发布时间】:2019-03-26 12:11:31 【问题描述】:

我有下面的 MSBuild 可以从我的 proto 文件生成 .cs 文件。构建工作正常,直到我进行重建,它抱怨源文件“生成的原型输出/Trade.cs#”指定了多次。

如何在每次构建/重建之前删除我的 .cs 文件?

错误

严重性代码描述项目文件行抑制状态 警告 CS2002 源文件 'generated-proto-output\ErrorTrade.cs' 多次指定 MyComp.Trade.Model C:\dev\workspaces\trade-model-workspace\model\csharp\MyComp.Trade.Model

在 csproj 文件中构建 sn-p

    <ItemGroup>
        <Protobuf Remove="%(RelativePath)generated-proto-output/**/*.cs" />
        <Protobuf Include="../../proto/**/*.proto" ProtoRoot="../../proto/" OutputDir="%(RelativePath)generated-proto-output/" GrpcServices="None" />
        <Protobuf Update="../../proto/**/*Service.proto" GrpcServices="Both" />
      </ItemGroup>

更新 - 完整的 CSProj 文件(根据 Lance 的要求)

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

  <PropertyGroup>
    <PackageId>TradeStore.Model</PackageId>
    <ProtoIncludes>.;../../proto</ProtoIncludes>
    <OutputType>Library</OutputType>
    <TargetFramework>netstandard2.0</TargetFramework>
    <Protobuf_NoWarnMissingExpected>true</Protobuf_NoWarnMissingExpected>
  </PropertyGroup>  

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.6.1" />    
    <PackageReference Include="Grpc" Version="1.19.0" />
    <PackageReference Include="Grpc.Tools" Version="1.19.0" PrivateAssets="All" />
  </ItemGroup>

  <ItemGroup>
    <FilesToDelete Include="%(RelativePath)generated-proto-output/*.cs" />
  </ItemGroup>

  <Target Name="DeleteSpecificFiles" BeforeTargets="Build">    
    <Message Text="Specific Files: @(FilesToDelete)"/>
    <Message Text ="Beginning to delete specific files before build or rebuild..."/>
    <Delete Files="@(FilesToDelete)"/>
  </Target>

    <ItemGroup>    
      <Protobuf Include="../../proto/**/*.proto" ProtoRoot="../../proto/" OutputDir="%(RelativePath)generated-proto-output/" GrpcServices="None" />
      <Protobuf Update="../../proto/**/*Service.proto" GrpcServices="Both" />
    </ItemGroup>

</Project>

【问题讨论】:

嗨,有更新吗?如果此问题仍然存在,您能否在此处分享具有类似问题的 csproj 文件或简单示例。? 嗨@LanceLi-MSFT,建议的解决方案不起作用。我无法提供整个项目,但提供了完整的 csproj 文件。请告知删除未按预期进行的问题。 我还用文件夹的完整路径替换了相对路径语法,这也无助于删除文件。我看到消息打印在控制台日志中,但仅此而已,没有文件删除发生。 连完整路径都行不通?请将您的 vs 版本更新到最新版本,并在完整路径中使用“\”而不是“/”。 如果你得到一些消息来显示日志中的指定文件,那么奇怪的是你找不到删除任务(在目标中),确保你在 VS IDE 中运行它。还有你的vs版本是什么,我不确定你的msbuild版本是否支持delete任务。 【参考方案1】:

尝试将CompileOutputs="false" 添加到指令中。这将抑制警告,并且不会要求您在构建 csharp protobuf build integration 之前删除文件

【讨论】:

【参考方案2】:

如何在每次构建/重建之前删除我的 .cs 文件?

在下面使用BeforeTargets 尝试以下脚本:

<Project...>
...
  <ItemGroup>
    <FilesToDelete Include="MyPath/*.cs" />
  </ItemGroup>
  <Target Name="DeleteSpecificFiles" BeforeTargets="build">
    <Message Text="Specific Files: @(FilesToDelete)"/>
    <Message Text ="Beginning to delete specific files before build or rebuild..."/>
    <Delete Files="@(FilesToDelete)"/>
  </Target>
</Project>

另外:

没有看到你的 .csproj 的全部内容,所以我不知道为什么你使用的构建 sn-p 不能工作。但是message task 可能有助于输出一些消息,无论引擎是否通过您给定的路径找到文件。

在 Visual Studio 中,如果您 go Tools=&gt;Options=&gt;Project and Solutions=&gt;Build and Run 将构建的详细程度更改为 Detailed,您将在每次构建和重建后看到详细的输出消息。Ctrl+F并输入目标名称,您将找到有关删除的详细信息进程:

希望对您的故障排除有所帮助。

【讨论】:

以上是关于如何从生成的文件夹中删除自动生成的 proto 文件的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Protocol Buffers .NET 代码生成 .proto 文件?

如何从根 cpanel (public_html) 重新生成所有文件?

在预构建事件中使用 protogen 从 .proto 文件生成 c# 文件

从 proto 文件生成 C#,反之亦然解释自定义选项

从 protobuf-net 中的自定义 RuntimeTypeModel 生成 .proto 文件

2022-04-06:go中proto文件能跨平台,那是因为能生成不同语言的代码,做框架开发用protoc+插件生成代码是不合适的,需要解析,请问如何解析?