【问题标题】:How can one determine if a csproj is being run on a TFS build agent?如何确定 csproj 是否正在 TFS 构建代理上运行?
【发布时间】:2013-12-22 11:24:31
【问题描述】:

我们使用 TFS 2010。

有几个项目的部署步骤必须知道它们是在开发机器上还是在 TFS 构建代理上运行。

现在他们检查构建是否来自 Visual Studio,假设只有开发人员从 VS 编译。唉,这意味着我无法从命令行编译!

那么,我的问题是 msbuild 脚本如何确定它是否正在由 TFS 构建代理运行?

【问题讨论】:

    标签: tfs msbuild tfsbuild


    【解决方案1】:

    你有几个选择:

    1. '$(BuildingInsideVisualStudio)' != ''
    2. '$(TeamBuildConstants)' != ''(在团队 Build 2008 中支持)
    3. '$(IsDesktopBuild)' == 'false'
    4. '$(tf_build)' != ''(最新版本的 Azure Pipelines 支持)

    您可以检查其中任何一个来检测执行任务的上下文。如果两者都未评估,则从命令行或其他进程调用了 MsBuild。

    【讨论】:

    【解决方案2】:

    我有 TFS2012 并使用它:

    <IsTfsServerBuild Condition=" '$(IsTfsServerBuild)' == '' ">false</IsTfsServerBuild>
    <IsTfsServerBuild Condition=" '$(BuildingInsideVisualStudio)' != 'true' AND '$(BuildUri)' != '' ">true</IsTfsServerBuild>
    

    【讨论】:

      【解决方案3】:

      我想提供我自己的答案,更新到 2020 年。

      我们这样做的方式是检查环境变量,因为 TFS(现在的 Azure DevOps)通过环境公开构建变量。在 msbuild 代码中进行测试时,它们看起来与在 msbuild 命令行中传递的构建变量相同,但我们也使用仅依赖于环境的 powershell 脚本。

      另外,我有时想区分构建管道和发布管道,因为在经典的发布管道中(与 yaml 不同,我们在 prem 中没有)有些东西不一样(比如 vsts 日志命令)

      所以,这就是我们正在使用的:

      • BUILD_BUILDNUMBER - 存在于构建和发布中,因为我们所有的发布都包含构建工件
      • RELEASE_ENVIRONMENTNAME - 仅存在于经典发布管道中
      • TF_BUILD - 不确定是否存在于发布中,肯定存在于构建中

      我不会打扰BuildingInsideVisualStudio,因为在命令行上使用 msbuild 构建时它是错误的,但它不是在 CI 服务器上构建的。

      【讨论】:

        【解决方案4】:

        从命令行调用 MSBuild 时,您可以像这样传递/覆盖属性:

        # Simulate Visual Studio build
        . msbuild.exe Project.csproj /p:BuildingInsideVisualStudio=true [...]
        
        # Custom property
        . msbuild.exe Project.csproj /p:MyCustomProperty=true [...]
        

        在我的 post/afterbuild 事件中使用这些来检查它们。

        【讨论】:

          猜你喜欢
          • 2012-07-11
          • 2012-02-22
          • 2017-03-21
          • 2019-12-20
          • 2018-11-29
          • 1970-01-01
          • 1970-01-01
          • 2014-03-08
          相关资源
          最近更新 更多