如何重新定义"重建解决方案"在Visual Studio中?

时间:2015-04-21 21:56:34

标签: visual-studio visual-studio-2012 build msbuild

我正在将几个项目从Visual Studio 2005转换为Visual Studio 2012.在执行此操作时,我注意到“重建解决方案”选项已经巧妙地改变了多项目解决方案(我发现这种微妙的行为改变,谢谢关于SO的两个very helpful个问题。 VS 2005似乎在Rebuild上做到了这一点:

  1. 清理项目A + B
  2. 构建项目A
  3. 构建项目B
  4. VS 2012似乎是这样做的:

    1. 清理项目A
    2. 构建项目A
    3. 清理项目B
    4. 构建项目B
    5. 当两个项目相互依赖时,这是有问题的,特别是当输出二进制文件放在同一个文件夹中时。有没有办法可以重新定义“重建解决方案”对给定项目的作用,以便它反映2005年的行为?

1 个答案:

答案 0 :(得分:2)

不是一件容易的事。在命令行上通过VS或msbuild重建解决方案实际上包括将解决方案和项目文件转换为临时的msbuild文件,然后使用该文件中的Rebuild目标调用msbuild。此重建目标碰巧定义类似于

<ItemGroup>
  <AllProjects Include="Project A"/>
  <AllProjects Include="Project B"/>
</ItemGroup>

<Target Name="Rebuild">
  <MSBuild Projects="@(AllProjects)" Targets="Rebuild"/>
</Target>

因此,它将始终导致每个项目的清洁/构建。你想要的是什么

<Target Name="Rebuild" DependsOnTargets="Clean;Build"/>

将首先为所有项目调用Clean,然后为所有项目调用Build。

但是我不认为有一种方法可以与msbuild文件的解决方案的转换过程进行交互,也不会重新定义Rebuild Solution在VS中所做的事情(好吧可能有但是并不简单)。

一个穷人的黑客就是在VS中定义一个外部工具('工具 - &gt;外部工具...... - >添加'):将'命令'设置为你的msbuild命令,将'Title'设置为'CustomRebuild ',将'Arguments'设置为'$(SolutionDir)\ $(SolutionFileName)/ t:Clean; Build / p:Configuration = Debug; Platform = Win32'。然后你可以调用'Tools-&gt; CustomRebuild'命令(也可以通过键盘等),它会做你想要的。但是当然只适用于Debug | Win32。要摆脱这个问题,您可以编写自定义扩展,因为您可以访问当前配置和平台(afaik),然后以编程方式构建解决方案。

此主题的变化:向您的解决方案添加一个空的Makefile项目(右键单击 - > Add-&gt; New project-&gt; General-&gt; Makefile项目)并在其属性中设置'Rebuild All Command Line '到msbuild $(SolutionPath) /t:Clean;Build /p:Configuration=$(Configuration);Platform=$(Platform)。然后打开Configuration Manager并从构建中排除该项目(以避免无限循环)。现在,如果右键单击makefile项目并选择“仅限项目 - >仅重建”,它将有效地重建整个解决方案 - 但现在使用当前选定的配置和平台。