防止将引用的程序集 PDB 和 XML 文件复制到输出

我有一个 Visual Studio 2008 C #/。NET 3.5项目的后期建设任务的 ZIP 的内容。但是我发现我也得到了引用程序集的。Pdb (调试)和。Xml (文档)文件在我的输出目录(和 ZIP)。

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

我可以排除 * 。Pdb 时 ZIP’,但我不能毯排除 * 。Xml 文件,因为我有具有相同扩展名的部署文件。

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

36697 次浏览

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

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

我翻遍了 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>

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

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

如果只想排除 XML 文件(比如调试版本) ,可以这样做:

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

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

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

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

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

其他的答案我没有太多的运气,我最终找到了如何做到这一点,在我的实现中使用内置的 “删除”命令,显然有一个具体的方式,你需要的 实现通配符,它的 有点微妙,这里的一切你需要放入你的“ CSPROJ”(目标编号是一个内置的变量,自动包含)在“项目”标签:

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

我也有麻烦与各种语言特定的文件夹生成,如果你有这个问题,你也可以删除未使用的语言特定的文件夹了。我选择只在构建类型“发布”下触发:

<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>

前两个答案对我不起作用。我在这个链接中找到了一个对我起作用的解决方案。

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

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

  2. 右键单击该项目并单击“ edit * . csproj”

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

  4. 重新装载和重建项目。

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