代码之家  ›  专栏  ›  技术社区  ›  Steve Cooper

运行MSBuild,尊重卸载的项目

  •  10
  • Steve Cooper  · 技术社区  · 14 年前

    在Visual Studio中,可以卸载项目,并且在生成解决方案(右键单击/build)时,不会生成已卸载的项目。但是,当您从命令行运行MSBuild时,如下所示;

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

    项目 建造。是否有方法让MSBuild尊重在Visual Studio中卸载的项目?

    现在的情况是,我们有一个解决方案,有许多项目。其中一个需要特殊的软件来构建,它存在于我们的构建机器上,而不是在所有开发机器上。这意味着我不能直接执行命令行构建,否则当它遇到rogue项目时就会失败。

    有什么想法吗?

    [编辑:MSBuild必须能够执行此操作,因为Visual Studio使用MSBuild执行生成。命令行没有VS做什么?]

    3 回复  |  直到 14 年前
        1
  •  7
  •   adrianbanks    14 年前

    MSBuild不知道解决方案中的项目处于什么加载状态,因此您尝试执行的操作是不可能的。

    作为替代方案,您可以定义一个新的构建配置,称为 建造机器 (使用 Build -> Configuration Manager 菜单)。在此生成配置中,启用要生成的所有项目。这就是您在生成计算机上生成的配置。如果禁用特定项目在 调试 释放 生成配置(使用相同的菜单选项),您可以在开发计算机上生成这些配置,而无需卸载不想生成的项目。

    MSBuild支持生成配置,因此可以使用Visual Studio或MSBuild生成非生成计算机生成配置(例如调试、发布),并且不会生成有问题的项目。

        2
  •  1
  •   stijn    14 年前

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

    唯一的撤销是你必须保持它与你的解决方案文件同步。

        3
  •  1
  •   Ilya    13 年前

    一个可能的解决方案是 devenv /build ConfigurationName file.sln 而不是直接生成MSBuild。

    然而,在你的解决方案中, 卸载项目 一开始就不是正确的解决方案。正如我前面的人所说,为构建计算机使用单独的配置。