如何防止在发布模式下复制XML文档文件?


82

我有一个Visual Studio 2010项目,其中引用了一些第三方组件。它们的程序集随附有XML文档文件,这些文件对我们(仅我们)开发人员有用。并且无论何时构建项目(在Debug或Release模式下),这些XML文件都将被复制到build目录。

在Visual Studio中或通过MSBuild,我似乎找不到设置或开关来禁用将这些XML文件复制到构建目录的功能。生成后脚本可能是一个选择,但是很臭。有任何想法吗?谢谢。


1
为清楚起见,您在“添加引用”对话框中向部件添加了引用。现在,当您构建doc XML文件时,它会显示在您的输出路径中吗?
易卜拉欣(Ibrahim Hashimi)说

Answers:


112

生成项目时,.xml / .pdb文件是通过ResolveAssemblyReference任务收集的。调用ResolveAssemblyReference时,将传递相关文件的文件扩展名列表。该文件扩展名列表在MSBuild属性AllowedReferenceRelatedFileExtensions中捕获。默认情况下,该列表将包含“ .pdb; .xml”。

如果要排除所有相关参考文件,则只需将该属性的值覆盖为相关文件将不具有扩展名的内容。例如,您可以将AllowedReferenceRelatedFileExtensions设置为“-”。

您还可以自定义返回的文件列表。如果只想查找.pdb文件,则需要传递AllowedReferenceRelatedFileExtensions=".pdb"。在这种情况下,任何在.dll / .exe旁边具有.pdb文件的引用也将被复制。您还可以使用它来复制其他可能不会以.pdb / .xml结尾的相关文件。例如,如果您有一个名为MyAssembly.dll的引用程序集,并且在同一文件夹中存在MyAssembly.pdb和MyAssembly.foo(如果设置),AllowedReferenceRelatedFileExtensions=".pdb;.foo"则.pdb和.foo文件都将被复制到输出目录。


这就是答案。非常感谢你!
温贝托

15
有趣的是花了两年时间才得到答案。
易卜拉欣(Ibrahim Hashimi)说的2012年

我刚刚意识到我在2年前对此发表了评论,很抱歉没有回复:(
易卜拉欣·哈希米

7
关于具体如何:指定这个MSBuild的命令行或在项目文件stackoverflow.com/questions/2011434/...
yzorg

3
我们可以在Visual Studio中的哪里更改AllowedReferenceRelatedFileExtensions
Apostrofix

0

Visual Studio项目文件具有与任何msbuild文件相同的格式。因此,如果配置名称为“ Release”,则可以手动将条件添加到相应的部分中,以不复制xml文件。

它应该在改变

<ItemGroup>

<ItemGroup Condition="'$(CONFIG)'=='RELEASE'">

或类似的东西。


3
Visual Studio项目和解决方案文件是MSBuild文件。
2011年

@AMissico错误,解决方案文件不是MSBuild文件。
julealgon

虽然它们不是项目文件格式(XML),但它们仍然是支持MSBuild的文件。设置环境变量(set MSBuildEmitSolution=1或通过属性参数(p:msbuildemitsolution=1)。
AMissico

-4

如果.xml / .pdb标记为构建动作“内容”(等),则可以将其更改为“无”。您还应该确保它们的copy-to-build-output为false

两者都设置好了吗?


2
但是要做到这一点,我必须将它们添加为项目项...还是我弄错了?
温贝托

从编译器生成的.PDB和.XML文件永远不应包含在项目中,因为您最终将遇到递归构建错误和文件锁定。
Jamie Howarth'6

1
@codegecko您看到“无”了吗?他们需要与源dll相邻才能获得智能感知等。我从来没有遇到过这样的问题。
Marc Gravell

2
@codegecko谁对垃圾桶说了什么?我不会从那里引用...我通常从/ lib引用dll,XML和pdb。
Marc Gravell

1
Aaaaah,现在一分钱掉了,我误会了。将它们包含在/ lib文件夹中,在VS中进行引用,将这些项目添加到解决方案文件夹中,将输出类型指定为“ None”-即可。实际上可能会在我自己的项目上开始使用它-谢谢!
杰米·霍华斯

-5

将XML文件复制到发行版本中的文件夹中有什么问题?在我看来,这很好,并且真正的问题是与拾取文件并将其放入安装程序的代码有关。我认为从您自己的bin \ release文件夹中提取第三方dll不是一个好习惯。我会让安装程序从源代码树中的第三方文件夹中提取第三方dll。


2
问题在于这些文件除了辅助IntelliSense功能外没有其他功能。将它们包含在发行文件中没有任何意义。此外,不涉及安装程序……
温贝托

那么您如何部署您的应用程序?
罗素·麦克卢尔

3
因此,我的解决方案是修改复制脚本,以不复制您不想复制的文件。
罗素·麦克卢尔

2
那肯定可以工作。但这不是理想的解决方案,因为它会阻止文件在构建中被复制。我正在尝试了解此行为背后的逻辑。谢谢!
温贝托

4
好的书面XML文档文件很大。在每个版本上复制它们会缩短我的SSD的寿命。
springy76'7

-5

该设置位于相关项目的属性中,在“构建”选项卡下,取消选中“ XML文档文件”。它也是。* proj文件中<DocumentationFile>适用<PropertyGroup>于您的构建配置的MSBuild属性。


3
此响应不准确。他正在询问来自控制供应商的预生成的XML文件。仅当您生成自己的XML文件时,您的响应才有用。
凯文·卡利托夫斯基2012年

看来您可以在<PropertyGroup>元素的.csproj文件中进行设置:<AllowedReferenceRelatedFileExtensions>“。pdb”。=“” </ AllowedReferenceRelatedFileExtensions>
Jay
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.