2010-11-24 71 views
8

在Visual Studio中,您可以卸载项目,并且在构建解决方案(右键单击/构建)时,未构建卸载的项目。但是,当你从命令行运行MSBuild时,像这样;运行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做的命令行不是?]

+0

当Visual Studio构建时,它很可能会明确地将项目传递给MSBuild而不是解决方案文件。这就是它可以跳过项目的方式。我的答案详细说明了一种可以做你想做的替代方法。 – adrianbanks 2010-11-24 11:56:42

回答

6

MSBuild对解决方案中项目的加载状态一无所知,所以你试图做的事情是不可能的。

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

MSBuild尊重构建配置,因此您可以使用Visual Studio或MSBuild构建非构建机器构建配置(例如,调试,发布),并且不会构建令人讨厌的项目。

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> 

只有撤退是你必须与你的解决方案文件保持同步。

1

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

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