如何获取 TFS2015 Build (Build.vnext) 和 NuGet 包还原以使用自定义包源

How to get TFS2015 Build (Build.vnext) and NuGet package restore to use custom package sources

我正在尝试让我们的 TFS2015 Build (TFSBuild vnext) 与 VS Team Services 一起使用。

到目前为止,大多数 blogs and documentation 都有帮助,但尝试构建一个使用自定义包源进行 NuGet 自动包恢复的项目时除外。

我已经成功部署了一个 Team Services Build Agent(新的构建机制)并且一切似乎都很顺利,直到恢复 NuGet 包的构建任务失败。

失败是由于 custom/private 包源未从已安装的 VS 配置中获取,因此无法找到这些包。来自默认 NuGet 包提要的传统包确实可以毫无问题地恢复。

如何在使用代理时为 NuGet 指定额外的包源?

编辑:vcastro 询问了 NuGet 安装程序构建步骤和在该构建步骤的配置中定义路径。以上是使用 Visual Studio 构建步骤和集成选项来让 NuGet 恢复包。请参考此图片以供参考:

我在网上搜寻但收效甚微,但在摆弄以下内容后会有所帮助:

OK 似乎为 NuGet.config 配置的包源是按用户帐户存储的,例如

c:\Users\<<username>>\AppData\Roaming\NuGet\NuGet.config

我的问题更难解决,因为构建代理是 运行 作为 Windows ServiceLocal System 帐户下。因此,要为构建获取 NuGet 配置,我必须改用以下路径:

  • 64 位 Windows C:\Windows\SysWOW64\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config
  • 32 位 Windows C:\Windows\System32\config\systemprofile\AppData\Roaming\NuGet\NuGet.Config

您可能需要提升权限才能创建 NuGet 子文件夹和 NuGet.Config 文件。

注意:我没有使用Local Service帐户的解决方案。以上仅适用于 Local System(或实际用户)帐户。

向您的项目添加一个 NuGet.config 以指定备用包位置。解析规则在官方documentation.

中有明确的定义和解释

或者,您也可以在构建配置中的 Visual Studio Build 步骤之前添加一个 NuGet Installer 构建步骤,以恢复所有 NuGet 包。

在那里你可以将你的私人仓库的位置作为参数传递给 nuget.exe:

-source "https://www.nuget.org/api/v2/;http://mynugetserver"

一个解决方案(对我有用)是将 tfs 2015 构建代理服务(在我的构建机器 VSO Agent tsf.Agent-PC 上)的帐户更改为 tfsagent,例如,并将 Nuget.config 添加到C:\Users\tfsagent\AppData\Roaming\Nuget。就这些!

有一个名为 "NuGet Installer" 的新 VSTS 任务,它允许您签入 NuGet.config 文件并指定不同的包源。 运行 您之前的任务 运行 MSBuild。

如果您使用的是 VSTS NuGet Feed,则需要将构建服务帐户添加到 Feed 以启用包下载 https://www.visualstudio.com/get-started/package/use/common-identities

在 Team Foundation Server 2015 的 RTM 中,您必须添加 "NuGet Installer" 类型的构建步骤,并在 运行 实际构建过程之前恢复解决方案文件的包。在此任务中,您可以传递包含您的存储库路径的参数 -ConfigFile path/to/nuget.config

例如:

<configuration>
  <packageSources>
    <add key="Internal Nuget" value="\srv-nuget\Repo" />
  </packageSources>
</configuration>

  1. 在解决方案的 nuget.config 文件中指定您的自定义 NuGet 提要 URL。不要在此文件中存储任何用户名和密码。

    <add key="nuget.org" value="https://www.nuget.org/api/v2/" />
    <add key="MyCompany" value="https://nuget.mycompany.com:443/nuget" />
    
  2. 在 VSTS 的构建定义中创建用户名和密码变量。变量可以加密,不会显示在任何构建日志输出中。在这里,我将创建 MyCompanyNugetUserMyCompanyNugetPwd 变量。

  3. 在我们的构建步骤中,我们添加一个 Powershell 脚本作为第一个操作,这将读取用户名和密码变量并更新构建机器上的用户级别 nuget.config 文件。下面是我的内联 Powershell 脚本中的代码片段:

    Arguments:

    $(MyCompanyNugetUser) $(MyCompanyNugetPwd)
    

    Script:

    param($user, $pwd)
    
    $nugetFile = "$ENV:AGENT_HOMEDIRECTORY\agent\worker\tools\nuget.exe"
    Write-Output "Looking for nuget.exe in $nugetFile"
    
    if (-not (Test-Path $nugetFile))
    {
      Write-Error "nuget.exe could not be located."
      return
    }
    
    Write-Output "nuget.exe located"
    
    $cmd = "$nugetFile sources add -name MyCompany -source https://nuget.mycompany.com:443/nuget -username $user -password $pwd -StorePasswordInClearText"
    Write-Output $cmd
    iex $cmd
    
  4. 接下来,我们继续从微软的模板中执行默认的NuGet Restore步骤

更多信息:https://codingcase.com/2016/07/27/vsts-build-setup-custom-nuget-feeds-with-authentication/

HTH

如果您无法使其仅在 UWP 上运行,请确保您的包名称的 CASE 拼写正确。如果大小写错误,那么(仅适用于 UWP)我们的构建服务器会导致构建失败。

例如,如果您有一个名为 Com.Company.Components 的包并使用 "install-package com.company.components" 更新包(请注意首字母的大小写),那么构建服务器上的 UWP 构建可能无法在您的本地商店中找到该包。