【问题标题】:Run MSBuild, respect the unloaded projects运行 MSBuild,尊重已卸载的项目
【发布时间】:2010-11-24 10:57:13
【问题描述】:

在 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 做了哪些命令行不做的事情?]

【问题讨论】:

  • 当 Visual Studio 生成时,它很可能会显式地将要编译的项目传递给 MSBuild,而不是解决方案文件。这就是它可以跳过项目的方式。我的回答详细说明了一种替代方法,可以满足您的需求。

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


【解决方案1】:

MSBuild 对解决方案中项目的加载状态一无所知,因此您尝试执行的操作是不可能的。

作为替代方案,您可以定义一个名为 BUILD_MACHINE 的新构建配置(使用 Build -> Configuration Manager 菜单)。在此构建配置中,使您的所有项目都可以构建。这就是您在构建机器上构建的配置。如果您在 Debug 和 Release 构建配置中禁用特定项目的构建(使用相同的菜单选项),您可以在开发机器上构建这些配置而无需卸载您不想构建的项目。

MSBuild 支持构建配置,因此您可以使用 Visual Studio 或 MSBuild 构建非构建机器构建配置(例如调试、发布),而麻烦的项目将无法构建。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      项目是否卸载的信息不会进入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>
      

      只有撤回是您必须使其与您的解决方案文件保持同步。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-10-07
        • 2015-07-19
        • 1970-01-01
        • 1970-01-01
        • 2020-03-01
        • 1970-01-01
        • 2017-03-11
        相关资源
        最近更新 更多