防止将引用的程序集PDB和XML文件复制到输出
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防止将引用的程序集PDB和XML文件复制到输出相关的知识,希望对你有一定的参考价值。
我有一个Visual Studio 2008 C#/ .NET 3.5项目,其中包含一个后期构建任务来压缩内容。但是我发现我还在输出目录(和ZIP)中获取引用的程序集'.pdb(debug)和.xml(文档)文件。
例如,如果MyProject.csproj引用YourAssembly.dll,并且在与DLL相同的目录中存在YourAssembly.xml和YourAssembly.pdb文件,它们将显示在我的输出目录(和ZIP)中。
我可以在ZIP'ing时排除* .pdb但我不能排除* .xml文件,因为我有相同扩展名的部署文件。
有没有办法阻止项目复制引用的程序集PDB和XML文件?
您也可以通过命令行指定:
MsBuild.exe build.file /p:AllowedReferenceRelatedFileExtensions=none
我希望能够在我的主应用程序中添加和删除引用的程序集,同时避免需要维护我需要删除或排除的文件。
我挖了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>
您可以添加类似于del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"
的Post Build事件命令
这是一个相当古老的问题,但由于没有关于如何通过UI关闭生成PDB和XML文件的答案,我认为它应该在这里是为了完整性。
在Visual Studio 2013中:在项目属性中的“编译”选项卡下,取消选中“生成XML文档文件”,然后单击下面的“高级编译选项”并将“生成调试信息”更改为“无”,这样就可以了。
我的答案现在可能很简单,但我想分享我用来删除xml文件的BAT脚本,如果有相应的dll的话。如果您只想清理输出文件夹并且有其他不想删除的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新手。
我没有太多运气与其他答案,我终于弄明白如何在我的实现中使用内置的"Delete" command,显然有一个特定的方式,你需要implement wildcards,它是bit nuanced,这里是你需要的一切放入“CSPROJ”(TargetDir是一个内置变量,自动包含在“Project”标签下:
<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>
如果您不需要它们,为什么要生成.pdb
和.xml
文件呢?您可以在项目的属性→构建(→高级...)中禁用调试符号和文档文件生成。 (可能仅适用于Release
构建。)
如果您只想排除XML文件(例如调试版),您可以执行以下操作:
<AllowedReferenceRelatedFileExtensions>
<!-- Prevent default XML from debug release -->
*.xml
</AllowedReferenceRelatedFileExtensions>
基本上,列出的每个扩展名(以分号分隔)将被排除在外。
以上是关于防止将引用的程序集PDB和XML文件复制到输出的主要内容,如果未能解决你的问题,请参考以下文章
如何防止引用程序集的嵌入式依赖项被复制到Visual Studio中的输出文件夹?