由于难以理解的缺失输入而重建的项目

时间:2013-08-14 23:14:36

标签: .net visual-studio build msbuild

我正在研究在Visual Studio 2012中包含数百个C ++和C#项目的产品的构建系统。我正在尝试最小化SVN更新后VS / MSBuild所做的不必要的重建(通过修复)许多小问题使MSBuild认为项目需要构建时才真正没有。)

经过大量的工作,我已经实现了这一目标,但我想更进一步。我希望能够将保留的构建环境从一个构建机器复制到另一个构建机器,并且仍然能够在新机器上进行最小化构建(我确实有充分的理由将其与发布后的补丁构建相关联)。这带来了许多新问题,其中大部分都是可以修复的。但是,尽管机器是相同的(最初是从同一图像克隆),但仍有少数项目在复制后需要重建,我无法弄明白。

其中一个是使用CLR的C ++项目。根据Sysinternals Debug Viewer,它要在副本之后重建的原因是:

[4520]  up to date is missing: 'C:\WINDOWS\ASSEMBLY\NATIVEIMAGES_V4.0.30319_64\SYSTEM\92AE81C9B2BA0AD6ED7B7450EE024DC9\SYSTEM.NI.DLL.AUX' 
[4520]  up to date is missing: 'C:\WINDOWS\ASSEMBLY\NATIVEIMAGES_V4.0.30319_64\SYSTEM.XML\6EDF8B6D912547891F6EA5F12307C003\SYSTEM.XML.NI.DLL.AUX'

这对我来说意味着该项目正在寻找GAC中的内容作为构建的输入。该项目确实包含System.Xml作为程序集引用,但它被正确引用(来自Framework目录)。由于两台构建机器来自同一图像,所以一切都在同一个地方;当然,GAC会有所不同,但构建不应该考虑GAC。我无法在项目中看到任何内容,以表明它在GAC中寻找此程序集的原因。奇怪的是,即使是最初构建的机器在GAC中也没有System.Xml 4.0,据我所知。在这个项目在新机器上重建一次后,它很好...... GAC和随后的增量构建中的任何更改都不会给项目带来麻烦。

有人会想到在复制到克隆机器后第一次构建项目发生这种情况的原因吗?我想深入了解这一点,以便我可以使用所有可用的构建机器进行补丁构建。

修改 经过进一步的调查,我发现了一些线索。构建目录中的xdcmake.read.1.tlog文件引用上面提到的那些文件。出于某种原因,Cygwin的grep在此文件中找不到文本,因此我的初始搜索没有找到它。无论如何,我使用Process Monitor来查看Visual Studio在运行构建之前访问了哪些文件,这就是其中之一。

xdcmake用于为程序集创建代码文档xml文件...我无法理解为什么它会尝试引用不存在的文件。此外,我不明白为什么MSBuild正在查看以前的文档日志,以获取当前增量构建的输入。在我看来,这里有几个错误。

1 个答案:

答案 0 :(得分:1)

我想我会把解决方案放在这里以防其他人有一天遇到这个问题。

构建目录中的xdcmake.read.1.tlog文件引用了上面提到的那些文件。 xdcmake用于为程序集创建代码文档xml文件。某些.Net框架程序集(在上面的例子中是System.XML)中必定存在一些错误配置,导致xdcmake在GAC中引用它们而不是它们的正确位置。

解决方案是在增量构建之前对所有xdcmake.read文件中的GAC程序集进行删除引用。