我正在开发一个产品的构建系统,该产品包含 Visual Studio 2012 中的数百个 C++ 和 C# 项目。我试图最大限度地减少 VS/MSBuild 在 SVN 更新后所做的不必要的重建量(通过修复许多小问题这使得 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 会查看以前的文档日志以获取当前增量构建的输入。在我看来,这里有几个错误。