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


118

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

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

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

有没有一种方法可以防止项目复制引用的程序集PDB和XML文件?

Answers:


68

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

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

9
这看起来很可行,因为您可以将其包含在构建定义MSBuild参数中,而不必修改csproj文件。
松饼人2015年

2
这在TFS上非常有用,在我的情况下,无需修改100多个项目
ste-fu

也适用于TFS2018和非XAML样式的构建。
knipp

简洁快速的解决方案。谢谢
卡兰(Karan)

158

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

我通过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>

3
这可能是“正确”的方法,但是它是如此隐藏,对我的书来说是不好的。
Mladen Mihajlovic 2015年

1
从Visual Studio IDE进行构建时,此方法有效。但是,当通过MSBuild进行构建时,它对我不起作用。如果它在项目文件中,则无需将其指定为/ p选项。
redcurry

19

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


谢谢。如果您具有引用程序集的静态列表,则此方法有效。但是,在我们的案例中,我们有两打以上,其中许多在重构时不断变化。
杰森·莫尔斯

4
我个人认为这是正确的答案-另一种方法是让您入侵项目文件,而其他任何人(或您自己在几年后)都不知道在哪里可以看到这种情况。
Mladen Mihajlovic 2015年

1
我也喜欢这种方式。我喜欢让任何需要发生的事情(或最初打算发生的事情)完成,然后让构建后的事件使它最终像我想要的那样。这样看起来好多了!
Arvo Bowen

即使此解决方案有效,它也没有真正优化,因为您浪费了很多时间来复制要删除的内容。我也一直将构建之前/之后的步骤视为hack,因为它们在构建系统中无法比目标或proj文件更好地工作。
christ.s

哇@ christ.s,*笑*我希望自从我回答这个问题以来的十年中,Visual Studio团队能够使这一过程变得更容易。:-)
AndrewJacksonZA

5

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

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


15
这不会影响您包含的任何nuget包,它们仍将包含pdbxml文件。
Lankymart

我在csproj文件中使用了OctoPack属性,这对我的PDB和XML文件起到了作用。我也在使用VS2015。在“输出”下的“构建”->“高级”->在“输出”下将“调试信息”设置为none
Devin Prejean

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\

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


0

我对其他答案不太满意,我终于想出了如何使用内置的“删除”命令在实现中执行此操作,显然,您需要使用一种特定的方式来实现通配符,这 有点细微差别,这是您需要将所有内容放入“项目”标签下的“ CSPROJ”(TargetDir是内置变量,自动包含在内):

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

-3

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

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

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


1
这个问题及其接受的答案已有4年历史,您的回答几乎是该接受答案的复制粘贴。
扎克2015年

1
我所需要的只是XML文件的语法不同。我必须对此标签的正确语法进行一些研究。我发现原始答案很有帮助,并对其进行了投票,但认为如果他们只需要过滤特定的文件类型,我可以为其他人节省一些时间。
ProVega

11
但这不包括 xml文件,也不排除它吗?
大卫·加德纳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.