如何使用后期构建事件中的宏区分TFS构建和手动构建

7
在一个.proj文件的TFS后期构建脚本中,我想找出项目构建是通过TFS触发的构建还是手动触发的构建。请问有人可以建议我如何在后期构建事件中使用宏来实现这一点。
1个回答

12

简短回答:您可以在csproj文件中利用IsDesktopBuild MSBUILD属性来区分TFS和本地构建。

长回答:

开发者或团队构建?

为了区分构建环境,我们必须实现一种机制,以检测构建正在哪个环境中执行。换句话说,我们需要知道是否运行开发人员执行的本地构建,还是在构建服务器上运行的团队构建。 实际上,我们需要考虑三种不同的构建环境:

· Visual Studio Build - 开发人员在Visual Studio IDE内部在其自己的开发计算机上执行的构建

· Team Build - TFS(手动或计划)在构建上执行的构建。

· Desktop Build - 显式手动在开发工作站上执行的构建,使用命令“msbuild.exe tfsbuild.proj”。

“DesktopBuild”和“TeamBuild”在性质上非常相似,但“DesktopBuild”不会从源代码库执行“GetLatest”功能,不会对源代码树进行“Label”,也不会确定更改集。

当使用MSBUILD任务(主要在以下章节中使用)时,一种常见的方法是使用“IsDesktopBuild”和“BuildingSolutionFile”属性作为测试任务中的条件。 “IsDesktopBuild”属性在“Microsoft.TeamFoundationBuild.targets”中声明。“BuildingSolutionFile”属性由MSBUILD自动声明和分配。

下表列出了每个构建环境中这些属性的值。

Environment                    IsDesktopBuild                BuildingSolutionFile

Visual Studio Build               (empty)                         (empty)
Desktop Build                       true                            true
Team Build                         false                            true

使用“IsDesktopBuild”属性的一个要注意的地方是,它在许多目标文件中默认情况下未定义。在Visual Studio构建中,此属性将具有“空”值,因此我们将其初始化为“true”作为默认值。因此,我们需要在所有MSBUILD目标文件中显式定义它,以便在测试时使用。

我们只需将以下元素添加到所有需要区分开发机和构建服务器上的构建的目标文件中(在第一个“PropertyGroup”中)。

<IsDesktopBuild Condition="'$(IsDesktopBuild)' == ''">true</IsDesktopBuild>

更新:感谢@dbardakov。从VS 2012开始,我们可以使用该属性来查找构建是否在Visual Studio内部进行:

BuildingInsideVisualStudio

MSDN SOURCE - 用于在Visual Studio内部构建

MSDN SOURCE


非常感谢你,Isaiah。这些信息非常有用。 - Sriks
3
在vs2013中不支持$(IsDesktopBuild),现在有一个$(BuildingInsideVisualStudio)。来源:https://social.msdn.microsoft.com/Forums/vstudio/en-US/b721c3c8-2eb8-40f0-8398-034cb971aaa7/isdesktopbuild-always-empty-in-team-2010-and-visual-studio-2010-when-attempting-to-configure?forum=tfsbuild - dbardakov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接