127

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

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

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

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

4

8 回答 8

167

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

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

<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>
于 2010-02-19T22:24:01.827 回答
70

You can also specify this via the command line:

MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
于 2012-01-06T12:42:18.927 回答
20

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

于 2010-01-06T11:22:20.643 回答
5

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

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

于 2015-04-13T20:49:50.267 回答
4

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

以防万一,上面的链接不起作用:

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

  2. 右键单击该项目,然后单击“编辑 *.csproj”

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

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

     <AllowedReferenceRelatedFileExtensions>
              *.pdb;
              *.xml
     </AllowedReferenceRelatedFileExtensions>
    
于 2020-10-14T10:40:17.160 回答
2

我对其他答案没有太多的运气,我终于弄清楚了如何通过使用内置的“删除”命令在我的实现中做到这一点,显然你需要一种特定的方式来实现通配符,它 ​​有点微妙,这里是您需要放入“项目”标签下的“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>
于 2019-03-11T20:01:40.270 回答
0

我的回答现在可能很简单,但如果有相应的 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 新手。

于 2019-01-30T20:41:00.913 回答
-4

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

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

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

于 2014-01-08T19:14:30.160 回答