教程:使用 NuGet 源设置 vcpkg 二进制缓存

注意

本教程使用 Azure Artifacts 中托管的 NuGet 源,但只需一些更改,即可将相同的指令用于其他 NuGet 源提供程序,例如:GitHub 包。

vcpkg 支持使用 NuGet 包源以方便的方式上传和还原二进制包。

NuGet 包源具有访问控制功能,这使得它们非常适合限制对整个组织或工作组资源的访问。 NuGet 源受多个云存储提供程序(例如 Azure ArtifactsGitHub 包注册表)支持。

本教程介绍以下操作:

先决条件

  • 终端
  • vcpkg
  • NuGet 包源,或者如果没有,则为要遵循的 Azure DevOps 帐户
  • 终端
  • vcpkg
  • NuGet 包源,或者如果没有,则为要遵循的 Azure DevOps 帐户
  • 系统中安装的 mono

1 - 设置 NuGet 源

如果已有现有的 NuGet 包源,则请跳过此步骤。

按照说明设置 Azure Artifacts NuGet 源

还可以使用你选择的任何其他 NuGet 包源提供程序。

2 - 添加 NuGet 源

注意

在 Linux 上,你需要 mono 来执行 nuget.exe。 可以使用分发的系统包管理器安装 mono

vcpkg 获取其在二进制缓存操作期间使用的其自己的 nuget.exe 可执行文件副本。 本教程使用 vcpkg 获取的 nuget.exevcpkg fetch nuget 命令输出 vcpkg 获取的 nuget.exe 的位置,在必要时下载可执行文件。

运行以下命令,将 NuGet 源添加为源,将 <feed name> 替换为所选的任何名称,并将 <feed url> 替换为至 NuGet 源的 URL。

.$(vcpkg fetch nuget) sources add -Name <feed name> -Source <feed url>

执行以下命令,以提取至 NuGet 可执行文件的路径:

vcpkg fetch nuget

这将提供类似于 C:\path\to\nuget.exe 的输出。 请记下此路径。 使用从上一步中获取的路径,运行以下命令:

C:\path\to\nuget.exe sources add -Name <feed name> -Source <feed url>
mono `vcpkg fetch nuget | tail -n 1` sources add -Name <feed name> -Source <feed url>

提供 API 密钥

某些提供程序要求你使用 API 密钥将 NuGet 包推送到源。 例如,GitHub 包需要 GitHub PAT(个人访问令牌)作为 API 密钥;如果使用的是 Azure Artifacts,API 密钥则改为 AzureDevOps

使用以下命令为推送到 NuGet 源的所有包设置 API 密钥,并将 <apiKey> 替换为源的 API 密钥。

.$(vcpkg fetch nuget) setapikey <apikey> -Source <feed url>

执行以下命令,以提取至 NuGet 可执行文件的路径:

vcpkg fetch nuget

这将提供类似于 C:\path\to\nuget.exe 的输出。 请记下此路径。 使用从上一步中获取的路径,运行以下命令:

C:\path\to\nuget.exe setapikey <apikey> -Source <feed url>
mono `vcpkg fetch nuget | tail -n 1` setapikey <apiKey> -Source <feed url>

提供身份验证凭据

NuGet 源可能需要身份验证才能让你下载和上传包。 如果是这样,你可以通过将凭证作为参数添加到 nuget sources add 命令来提供凭证。

例如:

nuget sources add -Name my-packages -Source https://my.nuget.feed/vcpkg-cache/index.json -UserName myusername -Password mypassword -StorePasswordInClearText

某些提供程序(如 Azure Artifacts)可能需要不同的身份验证方法,请阅读对专用 NuGet 源进行身份验证一文以了解详细信息。

使用 nuget.config 文件

或者,你可以使用 nuget.config 文件遵照以下模板来配置 NuGet 源:

nuget.config

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="defaultPushSource" value="<feed url>" />
  </config>
  <apiKeys>
    <add key="<feed url>" value="<apikey>" />
  </apiKeys>
  <packageSources>
    <clear />
    <add  key="<feed name>" value="<feed url>" />
  </packageSources>
  <packageSourcesCredentials>
    <<feed name>>
      <add key="Username" value="<username>" />
      <add key="Password" value="<password>" />
    </<feed name>>
  </packageSourcesCredentials>
</configuration>

示例 nuget.config 文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <config>
    <add key="defaultPushSource" value="https://contoso.org/packages/" />
  </config>
  <apikeys>
    <add key="https://contoso.org/packages/" value="encrypted_api_key" />
  </apikeys>
  <packageSources>
    <clear />
    <add key="Contoso" value="https://contoso.org/packages/" />
  </packageSources>
  <packageSourcesCredentials>
    <Contoso>
      <add key="Username" value="user" />
      <add key="Password" value="..." />
    </Contoso>
  </packageSourcesCredentials>
</configuration>

vcpkg 要求你在 nuget.config 文件中设置一个 defaultPushSource,使用 NuGet 源的 URL 作为默认源来推送二进制包。

如果要将包上传到 Azure Artifacts NuGet 源,请通过运行 nuget setApiKey AzureDevOps -Source <feed url> -ConfigFile <path to nuget.config>AzureDevOps 作为源的 API 密钥。 否则,请将该值替换为源的正确 API 密钥(如果有)。

添加 <clear /> 源以忽略以前配置的其他值。 如果需要,可以在此文件中定义多个源,针对每个源使用一个 <add key="<feed name>" value="<feed url>" /> 条目。

运行以下命令,以使用 nuget.config 文件添加 NuGet 源,将 <path to nuget.config> 替换为至 nuget.config 文件的路径:

.$(vcpkg fetch nuget) sources add -ConfigFile <path to nuget.config>

执行以下命令,以提取至 NuGet 可执行文件的路径:

vcpkg fetch nuget

这将提供类似于 C:\path\to\nuget.exe 的输出。 请记下此路径。 使用从上一步中获取的路径,运行以下命令:

C:\path\to\nuget.exe sources add -ConfigFile <path to nuget.config>
mono `vcpkg fetch nuget | tail -n 1` sources add -ConfigFile <path to nuget.config>

3 - 将 vcpkg 配置为使用 NuGet 源

VCPKG_BINARY_SOURCES 环境变量设置如下:

$env:VCPKG_BINARY_SOURCES="clear;nuget,<feed url>,readwrite"

如果使用 nuget.config 文件,则请改为执行以下操作:

$env:VCPKG_BINARY_SOURCES="clear;nugetconfig,<path to nuget.config>"
set "VCPKG_BINARY_SOURCES=clear;nuget,<feed url>,readwrite"

如果使用 nuget.config 文件,则请改为执行以下操作:

set "VCPKG_BINARY_SOURCES=clear;nugetconfig,<path to nuget.config>"

注意

使用 export 命令设置 VCPKG_BINARY_SOURCES 只会影响当前 shell 会话。 要使此更改在整个会话中永久存在,需要将 export 命令添加到 shell 的配置文件脚本(例如,~/.bashrc~/.zshrc)。

export VCPKG_BINARY_SOURCES="clear;nuget,<feed url>,readwrite"

如果使用 nuget.config 文件,则请改为执行以下操作:

export VCPKG_BINARY_SOURCES="clear;nugetconfig,<path to nuget.config>"

大功告成! vcpkg 现在将从 NuGet 源上传或还原包。

后续步骤

下面是接下来要尝试的其他任务: