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

时间:2010-01-06 07:14:45

标签: xml visual-studio build pdb-files

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

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

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

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

9 个答案:

答案 0 :(得分:144)

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

我挖掘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>

答案 1 :(得分:61)

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

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

答案 2 :(得分:17)

您可以添加类似于del "$(TargetDir)YourAssembly*.xml", "$(TargetDir)YourAssembly*.pdb"

的Post Build事件命令

答案 3 :(得分:5)

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

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

答案 4 :(得分: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\

我花了一个小时才能完成此简单的工作(感谢“延迟扩展”的东西),并且在这里和那里进行所有类型的搜索。希望它能帮助像我这样的英美烟草新手。

答案 5 :(得分:0)

我对其他答案不太满意,我终于想出了如何使用内置的"Delete" command在实现中执行此操作,显然,您需要使用{{3} },即implement wildcards,这是您需要放入“项目”标签下的“ CSPROJ”(bit nuanced是内置变量,自动包含在内)的所有内容:

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

答案 6 :(得分:0)

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

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

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

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

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

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

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

答案 7 :(得分:-2)

如果您不需要它们,为什么要生成.pdb.xml个文件?您可以在项目的属性构建(→高级... )中禁用调试符号和文档文件生成。 (可能仅适用于Release版本。)

答案 8 :(得分:-3)

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

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

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