【问题标题】:What is the reason behind the multitude of NuGet.exe versions within the Tfs build agent folder?Tfs 构建代理文件夹中存在多个 NuGet.exe 版本的原因是什么?
【发布时间】:2018-07-26 19:28:11
【问题描述】:

我正在努力了解 Tfs 的 VNext 构建如何在后台处理 NuGet.exe 版本。

我正在运行 Tfs 2018 (16.122.27102.1) 本地服务器。 我的代理正在我的机器上的“C:\dev\tfs_bld_agents\scully\”位置上运行(作为 Windows 服务)

如果我理解正确,“Nuget 工具安装程序”(1) 将确保构建任务中指定的 NuGet.exe 版本(在本例中为 4.3.0)将安装在由代理。

随后的构建任务“NuGet 还原”(2) 将运行之前的构建任务 (1) 安装的 NuGet.exe,并执行 NuGet 还原命令。

但是,如果我在磁盘“C:\dev\tfs_bld_agents\scully\”上搜索构建代理的根文件夹,我会找到一系列不同版本的 NuGet.exe

  • 3.3.0
  • 3.5.0
  • 4.0.0
  • 4.3.0

NuGet.exe 版本所在的目录是:

这种行为的原因是什么,即构建代理文件夹中有所有这些不同的版本,看到我的构建定义指定的 NuGet.exe 版本只有 4.3.0 版?

假设我们不(或不能在较旧的 Tfs 版本中)运行“NuGet Tool Installer”构建任务,Tfs 构建代理将如何确定在机器上哪里可以找到 NuGet.exe?

【问题讨论】:

    标签: tfs nuget tfsbuild


    【解决方案1】:

    这些 NuGet.exe 版本默认包含在 NuGet Tool Installer 任务和 NuGet 任务中。当您对构建进行排队时,构建代理会下载构建所需的任务,然后您将看到这些 NuGet.exe 版本。

    【讨论】:

    • 感谢董策策的回答!当我查看nuget.org/downloads 时,我看到了这些可能的 NuGet.exe 版本。 - v4.6.0 - v4.5.1 - v4.4.1 - v4.3.0 - v4.1.0 - v3.5.0 - v3.4.4 - v3.3.0 - v2.8.6 看到我的构建代理文件夹中没有所有这些版本,这是否意味着等待我在构建步骤“Nuget 工具安装程序”中指定的版本(在本例中为 4.3.0),NuGet 工具安装程序任务将包含一组特定(有限)的 NuGet.exe?就我而言,我只有 4 个版本。
    • 是的。 NuGet Tool Installer 任务可以指定一个版本或版本范围的 NuGet 版本以使其在路径上可用。检查:docs.microsoft.com/zh-cn/vsts/build-release/tasks/tool/nuget
    【解决方案2】:

    因此,我执行了一些测试,试图跟踪在“Nuget 工具安装程序”Tfs 构建任务中使用不同版本的 NuGet 时会发生什么。对于基线,使用了 Tfs2018 (16.122.27102.1) 构建代理(服务类型),只需提取和配置。

    配置构建代理后,您的代理目录中将有以下 NuGet.exe: NuGet.exe 版本:3.3.0 (3.3.0.0212) - 注意:这是刚刚配置代理后,这里没有运行任何构建!

    然后我开始设置将由代理 mulder 执行的构建定义。构建定义包含“NuGet Tool Installer”构建任务。我的第一次尝试是指定 NuGet 2.8.6,然后运行“NuGet Tool Installer”构建任务。

    此任务完成后,我们会在构建代理文件夹中找到以下 NuGet.exe 工件:

    • NuGetInstaller
    • NuGetToolInstaller
    • 以及我们请求的 NuGet 版本,在位置提供...\_tool\NuGet\2.8.6\x64\nuget.exe

    从此时起,无论您指定哪个版本,...\_tasks\ 文件夹的内容对于 NuGet.exe 版本似乎都保持不变。

    唯一明显的变化是,您在此位置选择的每个新版本都添加了...\_tool\NuGet\{版本请求}\x64\nuget.exe。 因此,如果我们在“NuGet Tool Installer”构建任务中煞费苦心地选择每个可能的版本并运行它,我们最终会得到如下所示的分布:

    关于运行“NuGet Tool Installer”构建任务的代理产生的日志,突出的是在NuGet版本中每次切换后,都会出现以下消息:Prepending PATH environment variable。我假设目的是指向磁盘上选定的 NuGet.exe 版本。对于 2.8.6 版本,我们看到以下内容:

    Prepending PATH environment variable with directory: C:\TfsBuild\mulder\_work\_tool\NuGet\2.8.6\x64
    

    那么如果我们恢复到特定版本会发生什么?比如说从 v4.5.1 到 v2.8.6 - 它会清理一些版本吗? 不。它保留了所有内容,但会再次修改 PATH 变量以指向您恢复到的正确版本。

    Prepending PATH environment variable with directory: C:\TfsBuild\mulder\_work\_tool\NuGet\2.8.6\x64
    

    一个有趣的现象是您在 PATH 环境变量中看不到这些“Prepending”更改。 但是,如果您在调试中运行构建(通过将 system.debug 变量翻转为 true),您会看到一些有趣的细节。这一次,我可以看到变量确实滑到了现有 PATH 变量(在环境变量 GUI 中可见)的前面,最后还有 2 个。

    调试日志如下所示:

    Prepending PATH environment variable with directory: C:\TfsBuild\mulder\_work\_tool\NuGet\2.8.6\x64
    new Path: 
    C:\TfsBuild\mulder\_work\_tool\NuGet\2.8.6\x64;
    C:\TfsBuild\mulder\externals\git\cmd; 
    .
    ..
    <The existing paths variables>
    ..
    .
    C:\TfsBuild\mulder\bin;
    C:\TfsBuild\mulder\bin
    

    因此,它似乎检索了现有的 PATH 环境变量,然后在运行构建时将“新”必需变量插入到它们前面。

    显然,Tfs build 非常擅长确保手头始终有正确版本的 NuGet.exe,但清理旧版本并不是它的强项 :-)

    【讨论】:

      猜你喜欢
      • 2018-03-18
      • 2013-12-07
      • 2018-07-11
      • 1970-01-01
      • 2019-07-09
      • 2015-02-03
      • 2013-11-14
      • 2018-11-13
      • 2018-11-20
      相关资源
      最近更新 更多