如何重新定义 "Rebuild Solution" 在 Visual Studio 中的作用?

How to redefine what "Rebuild Solution" does in Visual Studio?

我正在将几个项目从 Visual Studio 2005 转换为 Visual Studio 2012。在执行此操作时,我注意到 "Rebuild Solution" 选项已针对多项目进行了细微更改解决方案(由于这里有两个 very helpful 问题,我发现这种细微的行为变化)。 VS 2005 似乎在重建时这样做:

  1. 清理项目 A + B
  2. 构建项目 A
  3. 构建项目 B

VS 2012 似乎是这样做的:

  1. 清理项目 A
  2. 构建项目 A
  3. 清理项目 B
  4. 构建项目 B

当两个项目相互依赖时,尤其是当输出二进制文件放在同一个文件夹中时,这是有问题的。有没有一种方法可以重新定义 "Rebuild Solution" 对给定项目的作用,使其反映 2005 年的行为?

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

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

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

因此它总是会导致每个项目 Clean/Build。你想要的是

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

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

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

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

此主题的变体:将一个空的 Makefile 项目添加到您的解决方案(右键单击->添加->新建项目->常规->Makefile 项目)并在其属性中将 'Rebuild All Command Line' 设置为 msbuild $(SolutionPath) /t:Clean;Build /p:Configuration=$(Configuration);Platform=$(Platform)。然后打开 Configuration Manager 并从构建中排除该项目(以避免无限循环)。现在,如果您右键单击 makefile 项目并 select 'Project Only->Rebuild only' 它将有效地重建整个解决方案 - 但现在使用当前 selected 配置和平台。