在两个解决方案中引用同一个项目会导致第二个解决方案的构建失败

Referencing the same project in two solutions causes building of the second solution to fail

我在 TFS 构建服务器上构建复杂项目时遇到错误。我能够使用更简单的设置重现错误,我将在此处使用它来描述问题。由于年代久远和复杂,该项目仍然使用 Visual Studio 2010 年的构建工具。

我有一个包含两个解决方案的存储库:WindowsProject1 和 WindowsProject2,它们都是 MFC 应用程序。 我还在两个解决方案中添加了 WindowsProjectTools 项目,因为 dll 在两个解决方案中都被主项目引用。

在构建服务器上构建解决方案时出现问题,如下所示:

第一个构建步骤 (WindowsProject1) 成功,但第二个 (WindowsProject2) 失败并出现以下错误:

Error C1090: PDB API call failed, error code '23' : '(

网络上有一些关于此错误的问题,但一直没有令人满意的解决方案。

我怀疑在两个构建步骤中构建 WindowsProjectTools 会因为某种原因发生冲突,也许中间文件夹相交,所以我将其更改为 $(SolutionDir)$(Configuration)\ 但它没有帮助。

但是,更改构建步骤顺序有助于构建 WindowsProject2 成功,但 WindowsProject1 失败。这让我相信解决方案和项目文件是有序的,但我缺少 TFS 中的一些设置。

我也曾尝试将 MSBuild 版本从 Latest 更改为 4.0(与 VS2010 关联的版本)但没有成功。

迁移到较新版本是一个明显的步骤。但是,迁移整个项目需要大量资源。我现在想避免这一步。

我在 Jenkins 构建服务器中发现了一个大部分类似问题的错误报告:https://issues.jenkins-ci.org/browse/JENKINS-9104

程序 mspdbsrv.exe 似乎不适合并行构建。 jenkins 的解决方法是更改​​临时目录:

_MSPDBSRV_ENDPOINT_=<UUID>
TMP=<Unique Tempdir>
TEMP=$TMP TMPDIR=$TMP

在另一个解决方案中,mspdbsrv 在整个构建过程中保持活动状态:

rem :: PITA to keep MSPDBSRV alive
set ORIG_BUILD_ID=%BUILD_ID%
set BUILD_ID=DoNotKillMe
start mspdbsrv -start -spawn
set BUILD_ID=%ORIG_BUILD_ID%
set ORIG_BUILD_ID=

(PITA一开始难倒我,没听说过,这到底是什么新技术!?然后笑死我了。)

都不适合我们。在后者中,构建服务器刚刚启动了 mspdbsrv.exe 的另一个实例。我们猜测每次构建新解决方案时都会启动服务器。由于构建步骤之间的时间很短(1/10 秒),我们推测服务器程序在退出后还没有准备好重新启动。我们现在实施的工作是解决方案构建步骤之间的 powershell 脚本构建步骤,等待 10 秒直到继续:

Start-Sleep -Seconds 10

这为 mspdbsrv.exe 提供了充足的关机和重启时间。 pdb api 错误不再发生。

我知道这只是另一种解决方法,但我们不能在这上面花更多时间。我们主要担心的是,我们的构建工件完好无损且形式正确,而其他解决方案(例如 /Z7 而不是 /Zi)并非如此。因此,我们的解决方法更胜一筹。

其他引发 PDB API 调用失败的情况,此解决方法可能无法解决错误代码“23”,但我的建议是考虑 mspdbsrv.exe.[=14 的行为=]