【发布时间】:2015-12-18 04:20:22
【问题描述】:
在 .proj 文件的 TFS 构建后脚本中,我想了解项目构建是通过 TFS 触发构建还是手动触发构建进行的。 有人可以建议我如何在 Post Build 事件中使用宏来做到这一点。
【问题讨论】:
标签: macros tfsbuild post-build-event
在 .proj 文件的 TFS 构建后脚本中,我想了解项目构建是通过 TFS 触发构建还是手动触发构建进行的。 有人可以建议我如何在 Post Build 事件中使用宏来做到这一点。
【问题讨论】:
标签: macros tfsbuild post-build-event
简短回答:您可以利用您的 csproj 文件中的 IsDesktopBuild MSBUILD 属性来区分 TFS 和本地构建。
长答案:
开发者还是团队构建?
为了区分构建环境,我们必须实现一种机制来检测构建在哪个环境中执行。换句话说,我们需要知道我们是在运行由开发人员执行的本地构建,还是在构建服务器上运行的团队构建。 事实上,我们需要考虑 3 种不同的构建环境:
· Visual Studio Build – 由开发人员在他们自己的开发机器上在 Visual Studio IDE 中执行的构建
· 团队构建 – 由 TFS(手动或计划)在构建中执行的构建。
· 桌面构建 – 在开发工作站上使用命令“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
使用“IsDesktopBuild”属性的一个注意事项是默认情况下它没有在许多目标文件中定义。此属性在 Visual Studio 构建中将具有“空”值,因此我们将其初始化为“真”值作为默认值。因此,我们需要在所有将对其进行测试的 MSBUILD 目标文件中明确定义它。
我们只需将以下元素添加到所有需要区分开发机器上的构建和构建服务器上的构建的目标文件中(在第一部分中)。
<IsDesktopBuild Condition="'$(IsDesktopBuild)' == ''">true</IsDesktopBuild>
更新:谢谢@dbardakov。从 VS 2012 开始,我们可以使用该属性来查找构建是否在 Visual Studio 中进行:
BuildingInsideVisualStudio
【讨论】:
$(IsDesktopBuild) 在 vs2013 中不受支持,现在有一个 $(BuildingInsideVisualStudio)。来源:social.msdn.microsoft.com/Forums/vstudio/en-US/…