我正在努力了解Tfs的VNext构建如何处理NuGet.exe版本。
我正在运行Tfs 2018(16.122.27102.1)本地服务器。 我的代理在我的机器上运行(作为Windows服务)位于“C:\ dev \ tfs_bld_agents \ scully \”
如果我理解正确,“Nuget工具安装程序”(1)将确保构建任务(在本例中为4.3.0)中指定的NuGet.exe版本将安装在此构建定义由剂。
随后的构建任务“NuGet Restore”(2)将运行上一个构建任务(1)安装的NuGet.exe,并将执行NuGet restore命令。
但是,如果我在磁盘“C:\ dev \ tfs_bld_agents \ scully \”上搜索构建代理的根文件夹,我会找到一组不同版本的NuGet.exe
这种行为的原因是什么,即在构建代理文件夹中包含所有这些不同的版本,看到我的构建定义指定的NuGet.exe版本只是版本4.3.0?
假设我们没有(或者不能在较旧的Tfs版本中)运行“NuGet Tool Installer”构建任务,那么Tfs构建代理将如何确定在机器上找到NuGet.exe的位置? / p>
答案 0 :(得分:0)
默认情况下,这些NuGet.exe版本包含在NuGet Tool Installer
任务和NuGet
任务中。当您对构建进行排队时,构建代理会下载构建需求的任务,然后您将看到这些NuGet.exe版本。
答案 1 :(得分:0)
所以我进行了一些测试,试图跟踪在“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工件:
从现在开始,无论您指定的是哪个版本,... \ _ tasks \文件夹的内容似乎都与NuGet.exe版本保持不变。
唯一明显的变化是,在此位置添加每个新版本... \ _ tool \ NuGet \ {version requested} \ x64 \ nuget.exe。 因此,如果我们在“NuGet Tool Installer”构建任务中精心选择每个可能的版本并运行它,我们最终会得到如下所示的传播:
关于运行“NuGet Tool Installer”构建任务的代理程序生成的日志记录,突出的事实是,在NuGet版本中的每次切换之后,会出现以下消息:预先添加PATH环境变量< / em>的。我假设目的是指向磁盘上选定的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环境变量中看到这些“前置”更改。 但是,如果您在调试中运行构建(通过将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构建非常擅长确保手头上总有正确版本的NuGet.exe,但清理旧版本并不是它的强项: - )