【发布时间】:2013-12-22 11:24:31
【问题描述】:
我们使用 TFS 2010。
有几个项目的部署步骤必须知道它们是在开发机器上还是在 TFS 构建代理上运行。
现在他们检查构建是否来自 Visual Studio,假设只有开发人员从 VS 编译。唉,这意味着我无法从命令行编译!
那么,我的问题是 msbuild 脚本如何确定它是否正在由 TFS 构建代理运行?
【问题讨论】:
我们使用 TFS 2010。
有几个项目的部署步骤必须知道它们是在开发机器上还是在 TFS 构建代理上运行。
现在他们检查构建是否来自 Visual Studio,假设只有开发人员从 VS 编译。唉,这意味着我无法从命令行编译!
那么,我的问题是 msbuild 脚本如何确定它是否正在由 TFS 构建代理运行?
【问题讨论】:
你有几个选择:
'$(BuildingInsideVisualStudio)' != '''$(TeamBuildConstants)' != ''(在团队 Build 2008 中支持)'$(IsDesktopBuild)' == 'false''$(tf_build)' != ''(最新版本的 Azure Pipelines 支持)您可以检查其中任何一个来检测执行任务的上下文。如果两者都未评估,则从命令行或其他进程调用了 MsBuild。
【讨论】:
IsDesktopBuild 而不是 TeamBuildConstants。
$(BuildingInsideVisualStudio)的否定版本。我添加了 IsDesktopBuild
我有 TFS2012 并使用它:
<IsTfsServerBuild Condition=" '$(IsTfsServerBuild)' == '' ">false</IsTfsServerBuild>
<IsTfsServerBuild Condition=" '$(BuildingInsideVisualStudio)' != 'true' AND '$(BuildUri)' != '' ">true</IsTfsServerBuild>
【讨论】:
我想提供我自己的答案,更新到 2020 年。
我们这样做的方式是检查环境变量,因为 TFS(现在的 Azure DevOps)通过环境公开构建变量。在 msbuild 代码中进行测试时,它们看起来与在 msbuild 命令行中传递的构建变量相同,但我们也使用仅依赖于环境的 powershell 脚本。
另外,我有时想区分构建管道和发布管道,因为在经典的发布管道中(与 yaml 不同,我们在 prem 中没有)有些东西不一样(比如 vsts 日志命令)
所以,这就是我们正在使用的:
BUILD_BUILDNUMBER - 存在于构建和发布中,因为我们所有的发布都包含构建工件RELEASE_ENVIRONMENTNAME - 仅存在于经典发布管道中TF_BUILD - 不确定是否存在于发布中,肯定存在于构建中我不会打扰BuildingInsideVisualStudio,因为在命令行上使用 msbuild 构建时它是错误的,但它不是在 CI 服务器上构建的。
【讨论】:
从命令行调用 MSBuild 时,您可以像这样传递/覆盖属性:
# Simulate Visual Studio build
. msbuild.exe Project.csproj /p:BuildingInsideVisualStudio=true [...]
# Custom property
. msbuild.exe Project.csproj /p:MyCustomProperty=true [...]
在我的 post/afterbuild 事件中使用这些来检查它们。
【讨论】: