【问题标题】:Preventing referenced assembly PDB and XML files copied to output防止将引用的程序集 PDB 和 XML 文件复制到输出
【发布时间】:2011-01-01 22:58:41
【问题描述】:

我有一个 Visual Studio 2008 C#/.NET 3.5 项目,其中包含一个用于压缩内容的后期构建任务。但是,我发现我还在输出目录(和 ZIP)中获取了引用程序集的 .pdb(调试)和 .xml(文档)文件。

例如,如果 MyProject.csproj 引用 YourAssembly.dll 并且在与 DLL 相同的目录中存在 YourAssembly.xml 和 YourAssembly.pdb 文件,它们将显示在我的输出目录(和 ZIP)中。

我可以在压缩时排除 *.pdb,但我不能完全排除 *.xml 文件,因为我有具有相同扩展名的部署文件。

有没有办法防止项目复制引用的程序集 PDB 和 XML 文件?

【问题讨论】:

  • @HenrikHolmgaardHøyer 这个问题与您的“可能重复”完全相反

标签: xml visual-studio build pdb-files


【解决方案1】:

我希望能够在我的主应用程序中添加和删除引用的程序集,同时避免需要维护我需要删除或排除的文件。

我翻遍了Microsoft.Common.targets 寻找可行的方法并找到了AllowedReferenceRelatedFileExtensions 属性。它默认为.pdb; .xml,所以我在我的项目文件中明确定义了它。问题是你需要 something (空白是不够的)否则它仍然会使用默认值。

<Project ...>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <AllowedReferenceRelatedFileExtensions>
      <!-- Prevent default XML and PDB files copied to output in RELEASE. 
           Only *.allowedextension files will be included, which doesn't exist in my case.
       -->
      .allowedextension
    </AllowedReferenceRelatedFileExtensions> 
  </PropertyGroup>

【讨论】:

  • 这可能是“正确”的方式,但它太隐蔽了,这在我的书中很糟糕。
  • 这在从 Visual Studio IDE 构建时有效。但是,在通过 MSBuild 构建时,它对我不起作用。如果它在项目文件中,我不需要将其指定为 /p 选项。
  • 适用于不熟悉 VS 项目幕后的任何人。这是一个很好的分步指南。kitsula.com/Article/How-to-exclude-xml-doc-files-from-msbuild
  • 我把这个 sn-p 放在 vs2019 的“debug|any cpu”部分。它不起作用
  • @bh_earth0 我也使用 VS 2019,它对我有用。我花了一段时间才弄清楚为什么一开始它不起作用 - 我有几个 .csproj 文件(用于我的 .sln 中的多个项目),我不得不将 放在每个 .csproj 文件中。
【解决方案2】:

您也可以通过命令行指定:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none

【讨论】:

  • 这看起来像是要走的路,因为您可以将它包含在您的构建定义 MSBuild 参数中,而不必修改 csproj 文件。
  • 这在 TFS 中效果很好,并且在我的情况下不必修改 100 个项目
  • 也适用于 TFS2018 和非 XAML 样式的构建。
  • 简洁快速的解决方案。谢谢
【解决方案3】:

您可以添加类似于del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb" 的构建后事件命令

【讨论】:

  • 谢谢。如果您有引用程序集的静态列表,则此方法有效。然而,在我们的案例中,我们有超过两打,其中许多在我们重构时不断变化。
  • 就我个人而言,我认为这是正确的答案——另一种方式是你破解了项目文件,而其他任何人(或多年后的你自己)都不知道在哪里可以看到这种情况被阻止。
  • 我也喜欢这种方式。我喜欢让任何需要发生的事情(或最初被设计为发生的事情)完成,然后让后期构建事件最终让它像我想要的那样。这样看起来就干净多了!
  • 即使这个解决方案有效,但它并没有真正优化,因为你会浪费时间复制你要删除的东西。我也一直将构建前/构建后步骤视为 hack,因为它们在构建系统中的工作效果不如目标或 proj 文件。
  • 哇 @christ.s , *chuckle * 我希望在我回答这个问题后的十年里,Visual Studio 团队会让这件事变得更容易。 :-)
【解决方案4】:

这是一个相当古老的问题,但由于没有关于如何通过 UI 关闭生成 PDB 和 XML 文件的答案,我认为它应该在这里是为了完整性。

在 Visual Studio 2013 中:在项目属性中,在编译选项卡下,取消选中“生成 XML 文档文件”,然后单击下方的“高级编译选项”并将“生成调试信息”更改为“无”,这样就可以了诀窍。

【讨论】:

  • 这不会影响您包含的任何 nuget 包,它们仍将具有 pdbxml 文件。
  • 我在我的 csproj 文件中使用 OctoPack 属性,这对我的 PDB 和 XML 文件起到了作用。我也在使用 VS 2015。构建 -> 输出下的高级 -> 将输出下的调试信息设置为无
【解决方案5】:

前 2 个答案对我不起作用。我在这个链接中找到了一个对我有用的解决方案。 http://kitsula.com/Article/How-to-exclude-xml-doc-files-from-msbuild.

以防万一,以上链接失效:

  1. 在解决方案资源管理器中卸载项目

  2. 右键单击项目并单击“编辑 *.csproj”

  3. 在每个环境的 PropertyGroup 部分添加下一行。

  4. 重新加载并重建项目。

     <AllowedReferenceRelatedFileExtensions>
              *.pdb;
              *.xml
     </AllowedReferenceRelatedFileExtensions>
    

【讨论】:

    【解决方案6】:

    我对其他答案没有太多运气,我终于通过使用内置的"Delete" command 弄清楚了如何在我的实现中做到这一点,显然您需要implement wildcards 的特定方式,它是@ 987654323@,这是您需要放入“项目”标签下的“CSPROJ”(TargetDir 是内置变量,自动包含)中的所有内容:

    <Target Name="RemoveFilesAfterBuild">   
        <ItemGroup>
            <XMLFilesToDelete Include="$(TargetDir)\*.xml"/>
            <PDBFilesToDelete Include="$(TargetDir)\*.pdb"/>
        </ItemGroup>
        <Delete Files="@(XMLFilesToDelete)" />
        <Delete Files="@(PDBFilesToDelete)" />
    </Target>
    

    我也遇到了生成各种特定语言文件夹的问题,如果您也遇到这个问题,您也可以删除未使用的特定语言文件夹。我选择仅在构建类型“Release”下触发它:

    <ItemGroup>
        <FluentValidationExcludedCultures Include="be;cs;cs-CZ;da;de;es;fa;fi;fr;ja;it;ko;mk;nl;pl;pt;ru;sv;tr;uk;zh-CN;zh-CHS;zh-CHT">
            <InProject>false</InProject>
        </FluentValidationExcludedCultures> 
    </ItemGroup>
    
    <Target Name="RemoveTranslationsAfterBuild" AfterTargets="AfterBuild" Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
        <RemoveDir Directories="@(FluentValidationExcludedCultures->'$(OutputPath)%(Filename)')" />
    
        <ItemGroup>
            <XMLFilesToDelete Include="$(TargetDir)\*.xml"/>
            <PDBFilesToDelete Include="$(TargetDir)\*.pdb"/>
        </ItemGroup>
        <Delete Files="@(XMLFilesToDelete)" />
        <Delete Files="@(PDBFilesToDelete)" />
    </Target>
    

    【讨论】:

      【解决方案7】:

      我现在的回答可能很简单,但如果有相应的 dll,我想分享我用来删除 xml 文件的 BAT 脚本。如果您只想清理输出文件夹并且有其他不想删除的 xml 文件,这很有用。

      SETLOCAL EnableDelayedExpansion
      
      SET targetDir=%1
      
      ECHO Deleting unnecessary XML files for dlls
      
      FOR %%F IN (%targetDir%*.xml) DO (
      
        SET xmlPath=%%~fF
        SET dllPath=!xmlPath:.xml=.dll!
      
        IF EXIST "!dllPath!" (
          ECHO Deleting "!xmlPath!"
          DEL "!xmlPath!"
        )
      )
      

      用法:

      Cleanup.bat c:\my-output-folder\
      

      我花了一个小时完成这个简单的工作(感谢“延迟扩展”的东西),到处都是各种类型的搜索。希望它可以帮助像我这样的其他 BAT 新手。

      【讨论】:

        【解决方案8】:

        如果您只想排除 XML 文件(例如调试版本),您可以执行以下操作:

        <AllowedReferenceRelatedFileExtensions>
          <!-- Prevent default XML from debug release  -->
              *.xml
         </AllowedReferenceRelatedFileExtensions>
        

        基本上,列出的每个扩展名(由分号分隔)都将被排除在外。

        【讨论】:

        • 这个问题及其接受的答案已有 4 年历史了,您的回答几乎是接受答案的复制粘贴。
        • 不同的是我需要的只是 XML 文件的语法。我不得不对这个标签的正确语法做一些研究。我发现原始答案很有帮助并对其进行了投票,但我认为如果他们只需要过滤特定的文件类型,我可以为其他人节省一些时间。
        • 但这不会包含 xml文件,而不是排除它吗?
        猜你喜欢
        • 2011-07-11
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 2011-02-28
        • 2023-03-03
        • 2018-10-28
        • 1970-01-01
        相关资源
        最近更新 更多