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

时间:2018-12-18 10:03:56

标签: visual-studio-2010 tfs msbuild mfc

在TFS构建服务器上构建复杂项目时出现错误。我能够通过更简单的设置重现该错误,我将在这里使用它来描述问题。由于年代久远和复杂性,该项目仍使用Visual Studio 2010的生成工具。

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

像这样在构建服务器上构建解决方案时会发生问题: enter image description here

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

enter image description here

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

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

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

但是,更改构建步骤的顺序可以帮助构建WindowsProject2成功,但是WindowsProject1失败。这使我相信解决方案和项目文件是正确的,但是我缺少TFS中的某些设置。

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

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

1 个答案:

答案 0 :(得分:0)

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

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

_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的行为。