覆盖端口
通常,vcpkg 端口是从注册表获取的。 你安装的大多数端口很可能来自于 https://github.com/Microsoft/vcpkg 上的官方 vcpkg 注册表。 vcpkg 可让你通过文件系统安装可用的端口,我们将这些端口称为覆盖端口。
覆盖端口可以直接替代现有端口,也可以充当注册表中不可用的新端口。 解析包名称时,优先解析覆盖端口的名称。
按以下顺序计算覆盖端口:
- 通过
--overlay-ports
命令行指定的目录,或命名的子目录(如果该目录没有CONTROL
或vcpkg.json
文件)。 - 在
overlay-ports
文件中通过或命名子目录指定的vcpkg-configuration.json
目录(如果该目录没有CONTROL
或vcpkg.json
文件)。 - 由环境变量条目指定的
VCPKG_OVERLAY_PORTS
目录,或命名的子目录(如果该目录没有CONTROL
或vcpkg.json
文件)。
解析端口名称时,选择包含匹配覆盖端口的第一个位置。
使用覆盖端口
如果指定了覆盖端口,首先,vcpkg 会尝试将该目录加载为端口。 如果成功,则目录本身被视为端口,并且覆盖的名称派生自 CONTROL
或 vcpkg.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 考虑c
或d
生成错误。
可以通过多种方式添加到覆盖端口配置:
- 命令行:向命令行添加一个或多个
--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 依赖项使用系统包管理器依赖项,请参阅我们的博客文章。