阻止MSBuild在.sln中构建项目而不使用解决方案配置

时间:2011-05-12 11:45:09

标签: msbuild teamcity solution azure-packaging

我想禁止构建解决方案中的某些项目(在TeamCity构建配置中,以便在必须知道的情况下优化我的Commit Build反馈的速度)。

我知道解决方案配置机制,但不希望强制使用大量.sln个文件来结束我希望能够关闭的每个事物的排列。我有基于约定的规则,我想说“如果我正在进行提交构建,我不想做最终的安装程序包装”。 (而且我不想将其分解为单独的解决方案)。

我不希望在.sln文件或通过.proj创建的[MsBuildEmitSolution][1]文件中使用涉及查找和替换的解决方案。我知道这里的问题涉及out of the box solutionthis slightly related question

我看到MSBuild /v:diag说:

 2>Target "Build" in file "Z.sln.metaproj" from project "Z.sln" (entry point):
   Using "MSBuild" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
   Task "MSBuild"
     Global Properties:
       BuildingSolutionFile=true
         CurrentSolutionConfigurationContents=<SolutionConfiguration>
   <ProjectConfiguration Project="{C83D035D-169B-4023-9BEE-1790C9FE22AB}" AbsolutePath="X.csproj" BuildProjectInSolution="True">Debug|AnyCPU</ProjectConfiguration>
   <ProjectConfiguration Project="{15E7887D-F1DB-4D85-8454-E4EF5CBDE6D5}" AbsolutePath="Y.csproj" BuildProjectInSolution="True">Debug|AnyCPU</ProjectConfiguration>
 </SolutionConfiguration>

所以问题是:

是否有整洁方式让我进行XPath替换或类似操作以改变BuildProjectInSolution=" True "BuildProjectInSolution=" False "

如果失败了,我可以在.ccproj(Azure 1.4软件包)或.csproj(一般项目)文件中进行相对简单的编辑,以产生影响(包括触发依赖在命令行msbuild Z.sln解决方案构建中启用的项目是否已取消?

3 个答案:

答案 0 :(得分:3)

您始终可以将要构建的特定项目作为参数传递给MSBuild。

MSBuild命令行如下所示:

MSBuild /t:<Project Name>:Rebuild;<Another Project Name>:Rebuild

在TeamCity中,您可以将<Project Name>:<Target Action>放在MSBuild运行器的目标字段中。

答案 1 :(得分:3)

不确定它是否符合 neat ,但您可以设置CustomAfterMicrosoftCommonTargets导入msbuild文件以覆盖BuildDependsOn属性,指向它你自己的自定义构建任务。基本上,通过设置CustomAfterMicrosoftCommonTargets,您可以获得msbuild来导入包含以下内容的msbuild文件:

<PropertyGroup>
    <OldBuildDependsOn>$(BuildDependsOn)</OldBuildDependsOn>
    <BuildDependsOn>MyBuild</BuildDependsOn>
</PropertyGroup>

<Target Name="OldBuild" DependsOnTargets="$(OldBuildDependsOn)" />

<Target Name="MyBuild">
    <CallTarget Targets="OldBuild" Condition="<IfIWantThis>" /> 
</Target>

修改

您可以使用以下MyBuild目标来根据以IncludeInBuildExcludeFromBuild属性传入的正则表达式来包含/排除项目。 (如果你想要复杂的正则表达式,你可能会违反MSBuild特殊字符转义,但这对于简单匹配来说效果很好)

  

&GT; msbuild / p:ExcludeFromBuild =“测试|安装| Azure”

<Target Name="MyBuild">
    <CallTarget Targets="OldBuild" Condition="('$(IncludeInBuild)'=='' OR
    '$([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectFullPath),
    $(IncludeInBuild), 
    System.Text.RegularExpressions.RegexOptions.IgnoreCase))'=='True') AND 
    ('$(ExcludeFromBuild)'=='' OR 
    '$([System.Text.RegularExpressions.Regex]::IsMatch($(MSBuildProjectFullPath), 
    $(ExcludeFromBuild),  
    System.Text.RegularExpressions.RegexOptions.IgnoreCase))'=='False')" /> 
</Target>

答案 2 :(得分:-1)

我在参数

下添加了一个系统参数
  • 姓名:system.ExcludeFromBuild
  • 种类:系统属性(system.
  • 价值:csproj的路径

parameter pass