如何从MSBUILD中的构建中排除项目?

And*_*hkn 38 msbuild nant visual-studio

我需要构建一个解决方案但排除一个项目.我该怎么办?我搜索了很多关于这个问题,但没有什么可以帮助.

ItemGroup部分引发以下异常:

元素无效.未知任务或数据类型.

PropertyGroup也崛起了例外.

以下是我的代码示例:

<project name="TI 8.1.6 build script">
  <ItemGroup>
    <Solution Include="${ROOT}\Core\TI Core.sln" Exclude="${ROOT}\Utilities\DTS Indexing Service\Tdi.Origami.IndexUpdaterServiceSetup\Tdi.Origami.IndexUpdaterServiceSetup.wixproj"/>
  </ItemGroup>
...
</project>
Run Code Online (Sandbox Code Playgroud)

那么有人可以帮助我吗?

Enr*_*lio 62

您可以使用Visual Studio中的Configuration Manager对话框在解决方案级别排除特定构建配置的项目:

配置管理器对话框

然后,你可以简单地调用msbuild解决方案文件指定build配置中使用:

msbuild /property:Configuration=Release MySolution.sln
Run Code Online (Sandbox Code Playgroud)

  • 选择`Release`作为解决方案配置,将所有项目配置设置为`Release`并取消选中`Build`为`Tdi.Origami.IndexUpdaterServiceSetup` (11认同)
  • 这没有帮助:( (7认同)
  • 我同意这里的所有投诉。最初的问题是通过 MSBUILD 而不是通过 GUI。所以所有对错误答案的赞成只会让我摇头。是的,它可以从 GUI 运行,但是如果我需要在持续集成环境中自动执行此任务,MSBUILD 似乎会构建配置中的所有项目,无论您是否选中了 GUI 中的构建框。如果 MSBUILD 中存在符合 Configuration Manager 设置的标志,我很想知道它是什么。 (6认同)
  • 有没有办法在命令行中从构建中排除项目? (4认同)
  • 我也在尝试从命令行执行此操作。为什么这么多 Windows 开发人员假设每个人都使用 GUI 进行构建? (4认同)
  • 是的,它也适用于我。实际上应该将其标记为答案。 (2认同)

sev*_*tov 17

Enrico建议的解决方案是最通用的解决方案.另一种解决方案可能是<MSBuild>直接使用任务.如果您将所有项目文件放在特定目录下,或者能够轻松枚举您要构建的所有项目(即解决方案中的项目数量不是很大),这将对您有用.

例如,这个msbuild文件将构建当前目录下的每个项目,但特定项目除外:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <MyProjectReferences Include="**\*.*proj" />
    <MyProjectReferences Exclude="Utilities\DTS Indexing Service\Tdi.Origami.IndexUpdaterServiceSetup\Tdi.Origami.IndexUpdaterServiceSetup.wixproj" />
  </ItemGroup>

  <Target Name="BuildAllExceptWixProject">
    <MSBuild Projects="@(MyProjectReferences)" Targets="Build" />
  </Target>

</Project>
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用命令行构建它 msbuild <myproject> /t:BuildAllExceptWixProject

  • 你是对的.但不是**ProjectReferences**而是**ProjectReference**.并且**包含**是**ProjectReference**项目的必要属性,因此我将**Include/Exclude**放入同一项目中.它的工作原理!该项目被成功排除在外.谢谢!! (3认同)
  • @LubochknAndrew,组的名称可以是任何有效的 XML 元素名称。`ProjectReference` 组只是已经在标准 Microsoft 目标中使用的组之一,这并不能使这个名称比您能想到的任何其他名称更好。请注意,我的答案中的示例未使用标准的 Microsoft 目标。 (2认同)

小智 14

在您的解决方案文件 (.sln) 中,删除 Build.0 条目。例如:

Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "MyProject", "MyProject.vcxproj", "{2281D9E7-5261-433D-BB04-176A61500CA3}"
EndProject

GlobalSection(ProjectConfigurationPlatforms) = postSolution
    {2281D9E7-5261-433D-BB04-176A61500CA3}.Debug|x86.Build.0 = Debug|x64
Run Code Online (Sandbox Code Playgroud)

如果您删除此“Build.0”条目,它将在解决方案中正常加载,但不会通过 GUI 或外部 MSBuild 构建。


小智 5

从 VS 2019 和 MSBuild 16.7 开始,正确的方法是使用解决方案过滤器。参考号