如何在Post构建事件中使用宏来区分TFS构建和手动构建

Sri*_*iks 6 macros tfsbuild post-build-event

在.proj文件的TFS post build脚本中,我想查找是否通过TFS触发的构建或手动触发的构建进行项目构建.有人可以建议我如何使用Post Build事件中的宏来执行此操作.

Isa*_*110 11

简短的回答:你可以利用你的csproj文件中的IsDesktopBuild MSBUILD财产到TFS和地方共建区分.

答案很长:

开发人员或团队构建?

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

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

· Team Build - 由TFS(手动或预定)在构建上执行的构建.

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

'DesktopBuild'和'TeamBuild'在性质上非常相似,除了'DesktopBuild'不从源存储库执行'GetLatest'功能,不会'标记'源树并且不会确定更改集.

使用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
Run Code Online (Sandbox Code Playgroud)

使用'IsDesktopBuild'属性的一个警告是默认情况下它没有在许多目标文件中定义.此属性在Visual Studio构建中将具有"空"值,因此我们将其初始化为值"true"作为默认值.因此,我们需要在将要测试它的所有MSBUILD目标文件中明确定义它.

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

<IsDesktopBuild Condition="'$(IsDesktopBuild)' == ''">true</IsDesktopBuild>
Run Code Online (Sandbox Code Playgroud)

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

BuildingInsideVisualStudio
Run Code Online (Sandbox Code Playgroud)

MSDN SOURCE - 适用于BuildingInsideVisualStudio

MSDN来源

  • 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年时,试图以进行配置?论坛= tfsbuild (3认同)