覆盖端口

通常,vcpkg 端口是从注册表获取的。 你安装的大多数端口很可能来自于 https://github.com/Microsoft/vcpkg 上的官方 vcpkg 注册表。 vcpkg 可让你通过文件系统安装可用的端口,我们将这些端口称为覆盖端口。

覆盖端口可以直接替代现有端口,也可以充当注册表中不可用的新端口。 解析包名称时,优先解析覆盖端口的名称。

按以下顺序计算覆盖端口:

  • 通过 --overlay-ports命令行指定的目录,或命名的子目录(如果该目录没有 CONTROLvcpkg.json 文件)。
  • overlay-ports文件中通过或命名子目录指定的vcpkg-configuration.json目录(如果该目录没有CONTROLvcpkg.json文件)。
  • 由环境变量条目指定的 VCPKG_OVERLAY_PORTS 目录,或命名的子目录(如果该目录没有 CONTROLvcpkg.json 文件)。

解析端口名称时,选择包含匹配覆盖端口的第一个位置。

使用覆盖端口

如果指定了覆盖端口,首先,vcpkg 会尝试将该目录加载为端口。 如果成功,则目录本身被视为端口,并且覆盖的名称派生自 CONTROLvcpkg.json 文件。 否则,将考虑具有覆盖端口名称的子目录。

有效的端口包含 portfile.cmake,或 vcpkg.json CONTROL

例如,请考虑以下目录结构:

  • x/vcpkg.json,字段 "name" 设置为 "a"
  • x/portfile.cmake,关联的生成说明 a
  • x/b/vcpkg.json,字段 "name" 设置为 "b"
  • x/b/portfile.cmake,关联的生成说明 b
  • y/c/vcpkg.json,字段 "name" 设置为 "c"
  • y/c/portfile.cmake,关联的生成说明 c
  • y/d/vcpkg.json,字段 "name" 设置为 "d"
  • y/d/portfile.cmake,关联的生成说明 d

根据以下设置,vcpkg 将考虑以下端口:

  • --overlay-ports=x:此覆盖 a区中有一个端口。 名称派生自 vcpkg.json. 不考虑子目录 b
  • --overlay-ports=x/b:此覆盖 b区中有一个端口。 名称派生自 vcpkg.json.
  • --overlay-ports=y:此覆盖层中有两个端口, c 以及 d。 它们的名称派生自其子目录 y,并且在其必须匹配的名称 vcpkg.json ,或者如果要求 vcpkg 考虑 cd生成错误。

可以通过多种方式添加到覆盖端口配置:

  • 命令行:向命令行添加一个或多个 --overlay-ports=<directory> 选项。
  • 清单:在 . 中vcpkg-configuration.json填充"overlay-ports"数组
  • 环境变量:设置为 VCPKG_OVERLAY_PORTS 路径字符分隔列表。

示例:覆盖端口示例

假设目录结构如下:

包含多个覆盖端口目录的示例

名为 team-ports 的覆盖目录包含端口 sqlite3、rapidjson 和 curl。 名为 team-ports 的覆盖目录包含端口 sqlite3 和 rapidjson。 vcpkg 目录包含默认注册表。

运行:

vcpkg install sqlite3 --overlay-ports=my-ports --overlay-ports=team-ports

若要进行安装:

  • sqlite3 来自 my-ports

运行:

vcpkg install sqlite3 rapidjson curl
    --overlay-ports=my-ports/rapidjson
    --overlay-ports=vcpkg/ports/curl
    --overlay-ports=team-ports

若要进行安装:

  • sqlite3 来自 team-ports
  • rapidjson 来自 my-ports
  • curl 来自 vcpkg/ports

示例:使用覆盖端口以使用系统包管理器依赖项

若要对 vcpkg 依赖项使用系统包管理器依赖项,请参阅我们的博客文章