如何使用 BatchBuild 并行构建多个 C++ Visual Studio v2015+ 配置

Posted

技术标签:

【中文标题】如何使用 BatchBuild 并行构建多个 C++ Visual Studio v2015+ 配置【英文标题】:How can you build multiple C++ visual studio v2015+ configurations in parallel using BatchBuild 【发布时间】:2020-05-11 09:58:06 【问题描述】:

我对 IDE 非常熟悉(23 年),但对 MSBuild 完全不熟悉。

我已经阅读并重新阅读了 https://docs.microsoft.com/en-gb/visualstudio/msbuild/building-multiple-projects-in-parallel-with-msbuild?view=vs-2015 关于让 MSBuild 并行构建多个配置的内容,但我不明白如何将其连接到“批量构建”(或者实际上是 MSBuild,这将是我的最佳选择)。

为了以不同的方式描述我想要实现的目标,如果我将项目的 30 个副本全部指向相同的代码,每个副本都有一个配置,那么我可以批量构建,它们将充分利用多个内核,一个配置 30 个项目,它们都是串行构建的,对 CPU 内核的使用非常差。

顺便说一句,我不明白为什么 IDE 可以选择并行构建多个项目和多个文件,但没有多个配置。

【问题讨论】:

非常感谢您的帮助,但我如何使用 A 做 B 的答案不是废弃 A 而使用 C。 C 可能是一个很好的工具,但它不是答案。最接近肯定答案的方法是对该功能进行投票并希望它进入 VS 更新。 【参考方案1】:

顺便说一句,我不明白为什么 IDE 有以下选项 并行构建多个项目和多个文件,但不是 多种配置。

其实,在 VS IDE 中,Batch Build UI 有一个选项来配置项目的配置。

但它可以为项目配置多个configurationPlatform.....但不会并行处理构建项目。

建议

我建议您可以使用 msbuild 脚本,然后使用 MSBuild 命令行 来运行多个平台的多个项目。

1)创建一个名为test.proj的文件

2)在其中添加这些:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <ProjectFile Include="C:\xxxx\ConsoleApplication1.vcxproj">
    <Properties>Configuration=Release</Properties>
    </ProjectFile>
      <ProjectFile Include="C:\xxx\ConsoleApplication1.vcxproj">
          <Properties>Configuration=Debug</Properties>
      </ProjectFile>

      <ProjectFile Include="C:\xxx\ConsoleApplication1.vcxproj">
          <Properties>Configuration=xxx</Properties>
      </ProjectFile>
      .....
      // add any configuration like this and remember to include the related vcxproj and even the same vcxproj has to be written for different configurations.
  </ItemGroup>

    <Target Name="ParelBuild"> 
        <MSBuild Projects="@(ProjectFile)" BuildInParallel="true" Targets="Build" />
    </Target>
</Project>

见this similar issue。

3) 注意Developer Command Prompt for VS2015 没有显示并行构建的功能,我感到很困惑。

所以要并行构建,我建议你可以下载Build Tool for VS2019,它可以与VS2019分开安装,并且支持低版本的MSBuild 14.0。而且我已经测试成功了。

(下载链接位于All Downloads-->Tools for Visual Studio 2019

4) 使用此 MSBuild 命令行进行构建:

msbuild test.proj -t:ParelBuild -v:normal -m:30

效果如下:

更新 1

在不同的时间建立你自己的项目组合,你可以试试这些:

 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <ItemGroup>
        <ProjectFile Include="C:\xxxx\ConsoleApplication1.vcxproj">
        <Properties>Configuration=Release</Properties>
        </ProjectFile>
          <ProjectFile Include="C:\xxx\ConsoleApplication1.vcxproj">
              <Properties>Configuration=Debug</Properties>
          </ProjectFile>

          <ProjectFile Include="C:\xxx\ConsoleApplication1.vcxproj">
              <Properties>Configuration=xxx</Properties>
          </ProjectFile>
          .....
          // add any configuration like this and remember to include the related vcxproj and even the same vcxproj has to be written for different configurations.
      </ItemGroup>

<ItemGroup>
        <ProjectFile1 Include="C:\xxxx\ConsoleApplication1.vcxproj">
        <Properties>Configuration=Release</Properties>
        </ProjectFile1>
          <ProjectFile1 Include="C:\xxx\xxx.sln">
              <Properties>Configuration=Debug</Properties>
          </ProjectFile1>
       ........     
      </ItemGroup>

        <Target Name="ParelBuild1"> 
            <MSBuild Projects="@(ProjectFile1)" BuildInParallel="true" Targets="Build" />
        </Target>
    </Project>

那么先一次构建 ParelBuild 目标:

msbuild test.proj -t:ParelBuild 

在它之后,在另一个时间,执行这个:

 msbuild test.proj -t:ParelBuild1 

这允许您在不同时间点并行执行组合项目。

【讨论】:

感谢您提供免费信息,但它不能回答问题。我需要在不同的时间构建不同的配置组合,所以看起来我需要一个 MSBuild 项目来处理每个可能的项目组合。第二个问题是您的答案不包括解决方案,因此将缺少解决方案信息。需要 BatchBuild 集成的这两个原因。看起来我可能能够指定解决方案,但我似乎记得无法指定解决方案、项目和配置但没有尝试过。 其实也可以像xxx.vcxproj文件一样定义xxx.sln文件:....... ProjectFile>,如果你想组合不同的项目,你可以编写几个构建目标来执行你想要的构建过程。 我现在就这样做,并将研究如何清理所有内容然后构建所有内容。我已经制作了一个单独的 .sln,其中只包含需要像这样构建的项目,所以我可以指定 .sln 而不是 proj。我收到一个关于构建配置的错误 |BPC,这似乎很常见。这是由于具有环境变量 Platform=BPC。我不知道它是从哪里来的,所以我的解决方案是从一个 .bat 文件运行并在运行 build 之前自己在其中定义它。 另外,您可以将多个项目放入一个 sln 文件并像我的解决方案一样构建它。如果要添加平台,可以使用&lt;ProjectFile1 Include="C:\xxx\xxx.sln"&gt; &lt;Properties&gt;Configuration=Debug;Platform=xxx&lt;/Properties&gt; &lt;/ProjectFile1&gt;。要清理该组合项目,您也可以&lt;MSBuild Projects="@(ProjectFile1)" BuildInParallel="true" Targets="Clean" /&gt; &lt;/Target&gt;. 你可以试试我的解决方案并测试一下。如果实现您的要求,您可以考虑接受它,因为它有一个解决方法。【参考方案2】:

答案是你不能做我想做的事,但 Parry Qian-MSFT 有一个解决方法。 https://developercommunity.visualstudio.com/ 上有一个开放的请求,所以我赞成它,希望它可以轻松地集成到 Visual Studio 的未来版本中。我确定它可能是一个插件,但我目前没有时间调查。

【讨论】:

既然你对这个问题有自己的解决方案,我建议你可以标记你的答案。 该解决方法很有帮助,但不能回答问题,也不能替代 GUI 中与出色的内置 BatchBuild 功能配合使用的内置并行选项。

以上是关于如何使用 BatchBuild 并行构建多个 C++ Visual Studio v2015+ 配置的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Travis CI 中为 C++ 项目并行运行多个构建,每个构建都有单独的脚本?

VS2010:如何运行 devenv 以不并行化构建

如何关闭多项目构建的并行执行测试?

csharp BatchBuild.cs

如何在基于 C# 的 Windows 服务中处理以不同时间间隔并行运行的多个任务?

如何等待Jenkinsfile“并行”块内的所有执行程序?