注意
本教程使用 Azure Artifacts 中托管的 NuGet 源,但只需一些更改,即可将相同的指令用于其他 NuGet 源提供程序,例如:GitHub 包。
vcpkg 支持使用 NuGet 包源以方便的方式上传和还原二进制包。
NuGet 包源具有访问控制功能,这使得它们非常适合限制对整个组织或工作组资源的访问。 NuGet 源受多个云存储提供程序(例如 Azure Artifacts 和 GitHub 包注册表)支持。
本教程介绍以下操作:
先决条件
- 终端
- 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.exe。
vcpkg 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>" disableTLSCertificateValidation="false" />
</packageSources>
<packageSourceCredentials>
<<feed name>>
<add key="Username" value="<username>" />
<add key="ClearTextPassword" value="<password>" />
</<feed name>>
</packageSourceCredentials>
</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/" disableTLSCertificateValidation="false" />
</packageSources>
<packageSourceCredentials>
<Contoso>
<add key="Username" value="user" />
<add key="ClearTextPassword" value="..." />
</Contoso>
</packageSourceCredentials>
</configuration>
vcpkg 要求你在 defaultPushSource 文件中设置一个 nuget.config,使用 NuGet 源的 URL 作为默认源来推送二进制包。
如果要将包上传到 Azure Artifacts NuGet 源,请通过运行 AzureDevOps 将 nuget setApiKey AzureDevOps -Source <feed url> -ConfigFile <path to nuget.config> 作为源的 API 密钥。
否则,请将该值替换为源的正确 API 密钥(如果有)。
如果使用自签名证书,可能需要禁用 TLS 证书验证。 此选项只能通过 nuget.config 文件使用。
添加 <clear /> 源以忽略以前配置的其他值。 如果需要,可以在此文件中定义多个源,针对每个源使用一个 <add key="<feed name>" value="<feed url>" /> 条目。
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>"
注意
使用 VCPKG_BINARY_SOURCES 命令设置 export 只会影响当前 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>,readwrite"
大功告成! vcpkg 现在将从 NuGet 源上传或还原包。
后续步骤
下面是接下来要尝试的其他任务: