在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命令行没有做什么?]
答案 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。
但是,在您的解决方案中,卸载项目不是正确的解决方案。正如我之前的人所说,为构建机器使用单独的配置。