vcpkg 与 GitHub 依赖关系图集成

我们很高兴与大家分享,vcpkg 有一项实验性功能,可以向 GitHub 依赖关系图提供数据。我们正在积极开发此功能,并希望听到您的反馈。如果您对当前功能有任何想法或希望看到进一步的改进,请告诉我们。如果你对vcpkg支持的依赖关系图启用的任何GitHub特性有反馈,也请告诉我们,我们会确保GitHub的相关人员能够看到。

关于GitHub依赖关系图

GitHub 依赖关系图存储了一个仓库的依赖关系集合。除了能够可视化存储库的依赖项之外,GitHub 还在此数据之上构建了一些有用的功能,包括依赖项审查Dependabot 警报

启用GitHub依赖关系图

为存储库启用依赖关系图是 vcpkg 能够填充存储库的依赖关系的要求。默认情况下,GitHub 上的公共存储库启用依赖关系图。如果您希望为私有存储库启用依赖关系图,您应该按照 GitHub 文档来启用依赖关系图

如果您已经在 GitHub Actions 工作流程中使用了可重用操作并且启用了依赖关系图,那么您的存储库的依赖关系图很可能已经列出了一些依赖关系。通过选择存储库中的见解,然后选择依赖关系图来检查它。

填充依赖关系图的技巧

依赖关系图可能以通过两种方式得到填充。对于某些具有可以在清单文件中完整描述的静态依赖项列表的包管理系统,一旦这些清单被推送到存储库中,GitHub 将自动扫描这些清单,并将其在依赖关系图中显示。

对于更加动态的包管理系统,用于处理依赖关系列表的工具必须参与确定完整的依赖关系集。C 和 C++ 的完整依赖集通常高度依赖于构建配置和目标平台。对于这些生态系统,GitHub 有一个依赖项提交 API 工具,可以使用该 API 来提供依赖项信息,通常作为 GitHub Actions 工作流程作业的一部分。

使用 vcpkg 报告依赖关系

vcpkg 与 GitHub 依赖关系图的集成可以通过将 dependencygraph 添加到运行 vcpkg 的 GitHub Actions 工作流文件中的 VCPKG_FEATURE_FLAGS 环境变量来实现(直接或间接通过 CMake)。您还必须修改您的工作流文件,以设置环境变量 GITHUB_TOKEN 的值为 ${{secrets.GITHUB_TOKEN}},并通过在工作流文件顶部附近包含以下 YAML 片段来请求工作流作业将依赖关系信息写入存储库元数据的权限。

permissions:
  contents: write

一旦做出了这些更改,并且您的工作流再次运行,您就可以开始在 GitHub 的依赖关系图部分中看到 vcpkg.json 清单中列出的依赖关系。

有关更多信息,请参阅我们在 GitHub 集成中的文档——GitHub 依赖关系图

例子:

如果你想在一个干净的项目中试用,GitHub 上有一个实时的示例模板存储库。如果您想在现有项目中试用,请参阅下面定义的工作流文件,其中显示了启用该功能所需的更改。

下面的两个工作流示例都使用这里列出的 vcpkg.jsonmain.cpp 文件。

vcpkg.json 示例内容:

{
  "name": "your-project",
  "version-string": "0.0.1",
  "dependencies": [
    "fmt"
  ]
}

main.cpp 示例内容:

#define FMT_HEADER_ONLY
#include "fmt/color.h"

int main(int argc, char** argv)
{
    fmt::print(
        fg(fmt::color::light_salmon),
        "¡Hola, Mundo!\n"
    );
}

通过CMake集成间接实现:

在使用CMake时,添加以下文件以测试vcpkg依赖关系图集成。

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)

project(your-project CXX)
find_package(fmt REQUIRED)
set(CMAKE_CXX_STANDARD 20)

add_executable(hola main.cpp)

target_link_libraries(hola
  PRIVATE
    fmt::fmt)

.github/workflows/cmake.yml

name: Example that uses CMake integration

on:
  workflow_dispatch:

###############################################################################
# Add this section to your workflow file does not already have it to enable
# the job to write the dependency metadata.
###############################################################################
permissions:
  contents: write

###############################################################################
# Add these environment variables to your workflow to enable the vcpkg
# dependency graph integration.
###############################################################################
env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  VCPKG_FEATURE_FLAGS: dependencygraph

jobs:
  cmake:
    runs-on: ubuntu-latest

    # These steps assume an appropriate version of vcpkg is listed as a
    # submodule in your git repo. If it is not, you must update this workflow
    # to obtain it.

    steps:
      - uses: actions/checkout@v3
        with:
          submodules: 'recursive'  

      - name: Bootstrap vcpkg
        run: ${{ github.workspace }}/vcpkg/bootstrap-vcpkg.sh

      - name: Configure with CMake
        run: |
          cmake -B build -S ${{ github.workspace }} \
          -DCMAKE_TOOLCHAIN_FILE=${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake

      - name: Build with CMake
        run: cmake --build build

      - name: Hola, amigos
        run: ${{ github.workspace }}/build/hola

直接调用vcpkg install

添加以下文件以测试vcpkg依赖关系图与直接调用vcpkg install 的工作流的集成。

.github/workflows/build.yml

name: Example that directly invokes `vcpkg install`

on:
  push:
    branches: [ main ]
  workflow_dispatch:

###############################################################################
# Add this section to your workflow file does not already have it to enable
# the job to write the dependency metadata.
###############################################################################
permissions:
  contents: write

###############################################################################
# Add these environment variables to your workflow to enable the vcpkg
# dependency graph integration.
###############################################################################
env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
  VCPKG_FEATURE_FLAGS: dependencygraph

jobs:
  build:
    runs-on: ubuntu-latest

    # These steps assume an appropriate version of vcpkg is listed as a
    # submodule in your git repo. If it is not, you must update this workflow
    # to obtain it.

    steps:
      - uses: actions/checkout@v3
        with:
          submodules: 'recursive'  

      - name: Bootstrap vcpkg
        run: ${{ github.workspace }}/vcpkg/bootstrap-vcpkg.sh

      - name: Directly invoke `vcpkg install`
        run: ${{ github.workspace }}/vcpkg/vcpkg install

      - name: Build with G++
        run: g++ -I${{ github.workspace }}/vcpkg_installed/x64-linux/include -o hola main.cpp

      - name: Hola, amigos
        run: ${{ github.workspace }}/hola

号召行动

我们正在收集用户的反馈,以确定我们需要进行哪些改进才能将这种整合视为完全支持。这是为我们的用户开放真正强大的企业级依赖性管理的基础,我们很高兴你们都能尝试一下。您可以在 vcpkg 默认分支的最新提交中找到该功能和最新的错误修复。

和往常一样,如果您有反馈,请在下面给我们留言,或在 Twitter(@VisualC)或通过电子邮件 visualcpp@microsoft.com 联系我们。

posted @ 2023-09-06 18:20  vcpkg_C++包管理器  阅读(202)  评论(0编辑  收藏  举报