教程:使用 GitHub 包在 GitHub Actions 工作流中设置 vcpkg 二进制缓存

注意

本教程使用 GitHub 包中托管的 NuGet 源,但同样的说明只需极小的更改即可用于其他 NuGet 源提供程序,例如:Azure Artifacts。

GitHub 包为 vcpkg 生成的 NuGet 二进制包提供一个方便的存储库。 本教程介绍如何在使用 GitHub 包作为远程存储的 GitHub Actions 工作流中设置二进制缓存。

本教程介绍以下操作:

先决条件

  • 代码编辑器
  • 使用 GitHub Actions 的 GitHub 存储库
  • 使用 vcpkg 的项目

1 - 提供一个 GitHub 个人访问令牌

按照 GitHub 的说明为存储库生成一个经典个人访问令牌 (PAT),确保授予该令牌 packages:writepackages:read 权限。

然后将 GitHub PAT 添加为存储库的 GitHub Actions 工作流中可用的机密。 在本教程中,我们假定你将机密命名为 GH_PACKAGES_TOKEN

GITHUB_TOKEN 提供的内置 PAT 仅具有 packages:read 权限,如果计划在工作流中设置只读二进制缓存,则可以使用它。

2 - 启动 vcpkg

vcpkg 获取其在二进制缓存操作期间使用的其自己的 nuget.exe 可执行文件副本。 本教程使用 vcpkg 获取的 nuget.exe

添加用于启动工作流的 vcpkg 的步骤:

- name: Bootstrap vcpkg
  shell: pwsh
  run: ${{ github.workspace }}/vcpkg/bootstrap-vcpkg.bat
- name: Bootstrap vcpkg
  shell: bash
  run: ${{ github.workspace }}/vcpkg/bootstrap-vcpkg.sh

可能需要将 vcpkg 启动脚本的位置替换为工作流的正确位置,本教程假定 vcpkg 位于存储库根目录中的 vcpkg 文件夹。

3 - 设置所需的环境变量

将以下环境变量添加到工作流文件中(将 <OWNER> 替换为 GitHub 的用户名或组织名称):

env: 
  USERNAME: <OWNER>
  VCPKG_EXE: ${{ github.workspace }}/vcpkg/vcpkg
  FEED_URL: https://nuget.pkg.github.com/<OWNER>/index.json
  VCPKG_BINARY_SOURCES: "clear;nuget,https://nuget.pkg.github.com/<OWNER>/index.json,readwrite"

可能需要将 VCPKG_EXE 的值替换为启动 vcpkg 步骤中生成的 vcpkg 可执行文件的位置。

在此步骤中,你将 VCPKG_BINARY_SOURCES 配置为使用 GitHub 包源作为二进制缓存源,请阅读二进制缓存参考以了解详细信息。

4 - 将 GitHub 包添加为 NuGet 源

vcpkg fetch nuget 命令输出 vcpkg 获取的 nuget.exe 的位置,在必要时下载可执行文件。

添加以下 GitHub Actions 工作流文件中的步骤:

- name: Add NuGet sources
  shell: pwsh
  run: |
    .$(${{ env.VCPKG_EXE }} fetch nuget) `
      sources add `
      -Source "${{ env.FEED_URL }}" `
      -StorePasswordInClearText `
      -Name GitHubPackages `
      -UserName "${{ env.USERNAME }}" `
      -Password "${{ secrets.GH_PACKAGES_TOKEN }}"
    .$(${{ env.VCPKG_EXE }} fetch nuget) `
      setapikey "${{ secrets.GH_PACKAGES_TOKEN }}" `
      -Source "${{ env.FEED_URL }}"

在 Linux 上,你需要 mono 来执行 nuget.exe。 使用 Ubuntu 的 GitHub Actions 运行程序预安装有 mono。 否则,可以使用分发的系统包管理器安装 mono

- name: Add NuGet sources
  shell: bash
  env: 
    VCPKG_EXE: ${{ github.workspace }}/vcpkg/vcpkg
    USERNAME: <OWNER>
    FEED_URL: https://nuget.pkg.github.com/<OWNER>/index.json
  run: |
    mono `${{ env.VCPKG_EXE }} fetch nuget | tail -n 1` \
      sources add \
      -Source "${{ env.FEED_URL }}" \
      -StorePasswordInClearText \
      -Name GitHubPackages \
      -UserName "${{ env.USERNAME }}" \
      -Password "${{ secrets.GH_PACKAGES_TOKEN }}"
    mono `${{ env.VCPKG_EXE }} fetch nuget | tail -n 1` \
      setapikey "${{ secrets.GH_PACKAGES_TOKEN }}" \
      -Source "${{ env.FEED_URL }}"

可能需要将 GH_PACKAGES_TOKEN 替换为你为提供 GitHub 个人访问令牌步骤中生成的 PAT 提供的正确机密名称。

大功告成! vcpkg 现在将从托管在 GitHub Actions 工作流内的 GitHub 包上的 NuGet 源上传或还原包。

后续步骤

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