运行MSBuild,尊重卸载的项目

时间:2010-11-24 10:57:13

标签: visual-studio-2008 command-line msbuild

在Visual Studio中,您可以卸载项目,并在构建解决方案时(右键单击/构建),不会构建卸载的项目。但是,当您从命令行运行MSBuild时,就像这样;

C:\Windows\Microsoft.NET\Framework\v3.5\msbuild.exe 
  "$slnFile" /t:build /p:Configuration=Debug /verbosity:minimal

项目构建的。有没有办法让MSBuild尊重在Visual Studio中卸载的项目?

情况是我们有一个包含许多项目的解决方案。其中一个需要特殊的软件来构建,它存在于我们的构建机器上,但不存在于所有开发人员机器上。这意味着我无法进行直接的命令行构建,或者在遇到流氓项目时失败。

有什么想法吗?

[编辑:MSBuild必须能够这样做,因为Visual Studio使用MSBuild来进行构建。 VS命令行没有做什么?]

3 个答案:

答案 0 :(得分:6)

MSBuild对解决方案中项目的加载状态一无所知,因此您无法做到这一点。

作为替代方案,您可以定义名为 BUILD_MACHINE 的新构建配置(使用Build -> Configuration Manager菜单)。在此构建配置中,启用所有项目。这是您在构建计算机上构建的配置。如果您在调试发布构建配置(使用相同的菜单选项)中禁用特定项目,则可以在开发计算机上构建这些配置,而无需卸载你不想建立的项目。

MSBuild尊重构建配置,因此您可以使用Visual Studio或MSBuild构建非构建机器构建配置(例如,Debug,Release),并且不会构建麻烦的项目。

答案 1 :(得分:1)

有关项目是否已卸载的信息不会进入sln文件,而是进入xxx.user文件。因此,MSBuild不知道它。

最好的办法是创建一个简单的MSBuild文件,其中只包含可以在任何地方构建的项目,例如:

<!--build selection of projects-->
<Project
  ToolsVersion="3.5"
  xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <DevMachine Include="A\b.vcproj"/>
    <DevMachine Include="B\b.vcproj"/>
    <DevMachine Include="C\c.vcproj"/>
  </ItemGroup>

  <ItemGroup>
    <BuildMachine Include="D\d.vcproj"/>
    <BuildMachine Include="E\e.vcproj"/>
  </ItemGroup>

  <Target Name="All">
    <CallTarget Targets="MakeDevMachine"/>
    <CallTarget Targets="MakeBuildMachine"/>
  </Target>

  <Target Name="MakeDevMachine">
    <VCBuild
      Projects="@(DevMachine)"
    />
  </Target>

  <Target Name="MakeBuildMachine">
    <VCBuild
      Projects="@(BuildMachine)"
    />
  </Target>

</Project>

只有退出才能与解决方案文件保持同步。

答案 2 :(得分:1)

一种可能的解决方案是直接使用devenv /build ConfigurationName file.sln代替MSBuild。

但是,在您的解决方案中,卸载项目不是正确的解决方案。正如我之前的人所说,为构建机器使用单独的配置。