注册表参考文档
概述
本文介绍各类注册表的实现细节,具体包括每种注册表的推荐目录结构,以及其对应的版本数据库应包含的内容。
本文涵盖自定义注册表的实现相关信息。若需了解在项目中使用自定义注册表的方法,请参阅使用注册表一文。
Git 注册表
Git 注册表中的基线文件结构
顶层字段
baseline.json 文件的顶层对象是一个字典,字典中的每个键为一个命名基线(named baseline)。由于 Git 注册表的实现特性,必须存在一个名为 "default" 的命名基线,且该基线需包含注册表中所有端口与其基线版本的映射关系。
| 名称 | 类型 | 说明 |
|---|---|---|
default | 基线对象(BaselineObject) | Git 注册表必需的默认基线 |
| 命名基线 | 基线对象(BaselineObject) | 额外的基线,字段名对应基线名称 |
基线对象(BaselineObject)
基线对象是一个字典,每个键对应注册表中的一个端口名,值为该端口的最新版本。
| 名称 | 类型 | 说明 |
|---|---|---|
| 端口名 | 基线版本对象(BaselineVersionObject) | 端口名与其最新版本的映射关系 |
基线版本对象(BaselineVersionObject)
| 名称 | 类型 | 说明 |
|---|---|---|
baseline | 字符串 | 对应注册表中该端口的最新可用版本 |
port-version | 整数 | 对应注册表中该端口的最新端口版本 |
Git 注册表中 baseline.json 文件示例
若注册表中包含一个名为 foo、版本为 1.0.0#1 的端口,则 baseline.json 文件内容应如下:
{
"default": {
"foo": {
"baseline": "1.0.0",
"port-version": 1
}
}
}
Git 注册表中的版本文件结构
versions 目录包含注册表中所有软件包版本的相关信息,以及从仓库历史中获取这些版本的方法。
每个软件包的版本文件是一个 JSON 文件,文件名与软件包名相同,存放于 versions 目录下的子目录中;该子目录命名规则为软件包名的首字母加一个连字符。
例如,pcre2 软件包的版本文件路径为 versions\p-\pcre2.json。
顶层字段
| 名称 | 类型 | 说明 |
|---|---|---|
versions | 版本对象数组(VersionObject[]) | 版本对象数组,包含注册表历史中该端口每个版本的条目 |
版本对象(VersionObject)
| 名称 | 类型 | 说明 |
|---|---|---|
git-tree | 字符串 | 用于获取端口内容的 Git 树哈希值(SHA) |
versionversion-semverversion-dateversion-string | 字符串 | 上游版本信息 |
| port-version | 整数 | 端口文件修订版本 |
Git 注册表版本文件示例
{
"versions": [
{
"git-tree": "963060040c3ca463d17136e39c7317efb15eb6a5",
"version": "1.2.0",
"port-version": 0
},
{
"git-tree": "548c90710d59c174aa9ab10a24deb69f1d75ff8f",
"version": "1.1.0",
"port-version": 0
},
{
"git-tree": "67d60699c271b7716279fdea5a5c6543929eb90e",
"version": "1.0.0",
"port-version": 0
}
]
}
获取 git-tree 哈希值(SHA)
kmpkg 利用 Git 的能力从提交历史中获取端口的特定版本,具体方式是根据端口版本文件中指定的 git-tree 对象从仓库中检索内容。
Git 注册表中的每个端口目录都关联一个唯一的 SHA 值(在版本文件中称为 git-tree)。该 SHA 值由目录内容计算得出;每当仓库中提交的变更修改了该目录,其 SHA 值都会重新计算。
只要知道目录对应的特定 SHA 值,Git 就能检索该目录在历史任意节点的内容。kmpkg 正是利用这一特性,将特定端口版本与其对应的 SHA 值(git-tree)建立索引。
要获取指定版本下端口目录的 SHA 值,可使用以下 Git 命令:
git -C <path/to/ports> ls-tree --format='%(objectname)' <commit sha> -- <portname>
示例:
git -C %KMPKG_ROOT%/ports ls-tree --format='%(objectname)' HEAD -- curl
6ef1763f3cbe570d6378632c9b5793479c37fb07
该命令返回当前版本(HEAD)下 curl 端口所在目录的 SHA 值。
可通过 git show <git-tree> 命令查看 git-tree 包含的内容:
git show 6ef1763f3cbe570d6378632c9b5793479c37fb07
tree 6ef1763f3cbe570d6378632c9b5793479c37fb07
0005_remove_imp_suffix.patch
0020-fix-pc-file.patch
0022-deduplicate-libs.patch
cmake-config.patch
cmake-project-include.cmake
dependencies.patch
export-components.patch
portfile.cmake
redact-input-vars.diff
usage
kmpkg-cmake-wrapper.cmake
kmpkg.json
也可通过 git show <git-tree>:<file> 查看特定文件的内容:
git show 6ef1763f3cbe570d6378632c9b5793479c37fb07:usage
curl is compatible with built-in CMake targets:
find_package(CURL REQUIRED)
target_link_libraries(main PRIVATE CURL::libcurl)
手动通过这些 Git 命令维护数据库文件是一项繁琐的工作。因此,我们建议使用 x-add-version 命令——只要仓库遵循推荐的注册表结构,该命令可自动完成上述流程。有关如何在 Git 注册表中发布端口的示例,请参阅教程:通过 Git 将软件包发布到私有 kmpkg 注册表一文。
文件系统注册表
文件系统注册表中的基线文件结构
顶层字段
baseline.json 文件的顶层对象是一个字典,字典中的每个键为一个命名基线(named baseline)。基线应包含注册表中所有端口与其基线版本的映射关系。
| 名称 | 类型 | 说明 |
|---|---|---|
| 命名基线 | 基线对象(BaselineObject) | 额外的基线,字段名对应基线名称 |
基线对象(BaselineObject)
基线对象是一个字典,每个键对应注册表中的一个端口名,值为该端口的最新版本。
| 名称 | 类型 | 说明 |
|---|---|---|
| 端口名 | 基线版本对象(BaselineVersionObject) | 端口名与其最新版本的映射关系 |
基线版本对象(BaselineVersionObject)
| 名称 | 类型 | 说明 |
|---|---|---|
baseline | 字符串 | 对应注册表中该端口的最新可用版本 |
port-version | 整数 | 对应注册表中该端口的最新端口版本 |
文件系统注册表的基线文件结构与 Git 注册表 一致,唯一区别是文件系统注册表不要求必须存在 default 基线。
文件系统注册表中 baseline.json 文件示例
{
"2024-12-01": {
"foo": {
"baseline": "1.0.0",
"port-version": 1
}
}
}
文件系统注册表中的版本文件结构
versions 目录包含注册表中所有软件包版本的相关信息,以及从文件系统路径中获取这些版本的方法。
每个软件包的版本文件是一个 JSON 文件,文件名与软件包名相同,存放于 versions 目录下的子目录中;该子目录命名规则为软件包名的首字母加一个连字符。
例如,fmt 软件包的版本文件路径为 versions\f-\fmt.json。
顶层字段
| 名称 | 类型 | 说明 |
|---|---|---|
versions | 版本对象数组(VersionObject[]) | 版本对象数组,包含注册表中该端口每个版本的条目 |
版本对象(VersionObject)
| 名称 | 类型 | 说明 |
|---|---|---|
path | 字符串 | 对应版本端口文件所在的文件系统路径 |
versionversion-semverversion-dateversion-string | 字符串 | 上游版本信息 |
| port-version | 整数 | 端口文件修订版本 |
指定注册表路径时,可使用 $ 字符引用注册表的根目录;也可直接使用绝对路径。
文件系统注册表版本文件示例
{
"versions": [
{
"path": "$/ports/foo/1.2.0",
"version": "1.2.0",
"port-version": 0
},
{
"path": "$/ports/foo/1.1.0",
"version": "1.1.0",
"port-version": 0
},
{
"path": "$/ports/foo/1.0.0",
"version": "1.0.0",
"port-version": 0
}
]
}
后续步骤
你可尝试以下任务: