当递归构建解决方案的构建过程挂起(Build process hangs when recursiv

2019-10-22 01:22发布

在试图回答这太问题我遇到了,我无法解释,并希望对您输入的问题。

设定:

  1. 已经溶液包括几个C ++项目(Test.sln),
  2. 一个全新的项目添加到您的解决方案(BuildInstaller.vcxproj)
  3. 在文本编辑器打开BuildInstaller.vcxproj和附加下面的XML片断右关闭之前</Project>标签:
<Target Name="Build">
  <MSBuild Projects="..\Test.sln" Properties="Configuration=Release;Platform=Win32" />
  <MSBuild Projects="..\Test.sln" Properties="Configuration=Release;Platform=x64" />
</Target>
  1. 上面的代码将覆盖默认Build的BuildInstaller项目,每次项目正在兴建的目标,它建立与发布配置其父解决方案Win32和x64平台,
  2. 为了防止无限递归,打开配置管理在Visual Studio中,取消选择“生成”的BuildInstaller项目复选框调试/发布和Win32 / 64的所有组合,
  3. 然后,还在配置管理器,创建一个新的配置,如安装程序的,你应该取消所有其他项目的Build复选框,并保留它只是检查BuildInstaller,
  4. 现在建立您的安装配置解决方案。

我希望这个构建成功完成,但它只是挂起,即使BuildInstaller不应该建递归,因为我们递归构建Test.sln只为发布配置。

我不问这是否是一个好方法,或如何解决它,我只是好奇,为什么构建挂起。 设置输出窗口的详细程度来诊断是没有帮助我。

我使用Visual Studio 2013旗舰版。

Answer 1:

的MSBuild有大约在项目递归内部保护。 通常情况下,如果任何类型的循环依赖在构建图谱中发现您的构建将在的情况下失败,错误MSB4006。 这就是说,如果我猜可能是什么造成的窍门,如果是涉及到递归,我将会对的.sln文件侧倾斜。 其原因是,治疗的MSBuild文件的.sln的方式相当奇特。 任何它遇到.sln文件时,它把它转换成中间表示,实际的MSBuild引擎能够理解。 该中间表示不具有类似的项目文件的任何标识符,因此,如果是的.sln循环中的循环依赖关系检测逻辑可能无法正常工作。

为了解决您的特殊问题,有几个方法。 最简单的一种是从Test.sln删除BuildInstaller.vcxproj。 第二是修改BuildInstaller.vcxproj如下:

首先,创建一个的ItemGroup,填充了解决方案的所有项目:

<ItemGroup>
    <AllMyProjects Include="..\Proj1\Proj1.vcxproj" />
    <AllMyProjects Include="..\Proj2\Proj2.vcxproj" />
    ...
    <!-- DO NOT ADD BuildInstaller project to prevent recursion!!! -->
</ItemGroup>

然后建立对于每个配置项目:

<Target Name="Build">
    <MSBuild Projects="@AllMyProjects" Properties="Configuration=Release;Platform=Win32" />
    <MSBuild Projects="@AllMyProjects" Properties="Configuration=Release;Platform=x64" />
</Target>

第二种方法的缺点是,你必须要记住的.sln和您的安装项目之间保持同步的项目清单。



文章来源: Build process hangs when recursively building solution