11

我想禁止在解决方案中构建某些项目(在 TeamCity 构建配置中,以优化我的提交构建反馈的速度,如果您必须知道的话)。

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

我不希望使用涉及在.sln文件或.proj通过[MsBuildEmitSolution][1]. 我知道这里的问题涵盖了开箱即用的解决方案这个稍微相关的问题

我看到 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 替换或类似操作,以产生更改为上述项目 Y的效果BuildProjectInSolution="True"BuildProjectInSolution="False"

如果做不到这一点,我是否可以在.ccproj(Azure 1.4 包)或(一般项目)文件中进行相对简单的编辑,以导致在命令行解决方案构建.csproj中启用的项目的效果(包括触发依赖项目)msbuild Z.sln被取消?

4

3 回答 3

4

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

MSBuild 命令行如下所示:

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

在 TeamCity 中,您将<Project Name>:<Target Action>在 MSBuild 运行器中输入目标字段。

于 2011-05-12T15:03:52.687 回答
3

不确定它是否合格但您可以设置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 特殊字符转义,但这对于简单匹配来说已经足够好了)

> 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>
于 2013-09-19T17:06:47.203 回答
-1

我在参数下添加了一个系统参数

  • 姓名:system.ExcludeFromBuild
  • 种类:系统属性 ( system.)
  • 值:您的 csproj 的路径

参数传递

于 2017-05-15T23:41:55.930 回答