msbuild - 防止 MSBuild 在不使用解决方案配置的情况下在 .sln 中构建项目

标签 msbuild teamcity solution azure-packaging

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

我知道解决方案配置机制,但不想强制执行大量 .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 "对于上述项目 Y

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

最佳答案

不确定它是否符合整洁,但您可以设置 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基于作为 IncludeInBuild 传入的正则表达式的包含/排除项目的目标和 ExcludeFromBuild特性。 (如果你想要复杂的正则表达式,你可能会遇到 MSBuild 特殊字符转义的问题,但这对于简单匹配来说已经足够了)

> msbuild /p:ExcludeFromBuild="Tests|Install|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>

关于msbuild - 防止 MSBuild 在不使用解决方案配置的情况下在 .sln 中构建项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5977444/

相关文章:

msbuild - 在解决方案文件上调用自定义 MSBuild 目标

.net - 如何使用 MSBuild 从构建后事件运行目标

msbuild - TFS2013 MsTest,开关无效

msbuild - 使用 TeamCity 构建和部署特定的修订号

tomcat - Teamcity 不使用 Debians tomcat7 包启动

matlab - 警告:可能是虚假的解决方案。 [solvelib::checkSolutions]

.net - 如何在MSBuild中访问错误详细信息

c# - PC 重新启动后,Visual Studio 有时会重建未修改的项目

java - Gradle 和团队城市 : Overriding --init-script argument?

pandas - 我希望数据框中存在的客户的虚假值(value)多于真实值(value)。有关如何实现这一目标的任何建议