方案设计文档,指导 namespace 字段的实现和生态迁移。
mcpp 生态向 C++23 模块化方向发展。包索引中存在两类库:
- 模块化库(mcpplibs 生态):原生
export module,用import消费 - 非模块化库(compat):传统 C/C++ 库,通过 Form B 描述文件 +
#include消费
需要在 namespace 层面区分这两类,让用户一眼看出某个依赖是否是模块化的, 同时为未来"非模块化库迁移到模块化"提供清晰的升级路径。
| namespace | 含义 | 示例包 |
|---|---|---|
mcpplibs |
mcpplibs 生态的模块化 C++23 库 | cmdline, tinyhttps, llmapi, xpkg, templates |
mcpplibs.capi |
mcpplibs 的 C API 模块化封装子集 | lua (封装 Lua C API 为 C++23 module) |
compat |
非模块化的第三方 C/C++ 库(兼容性支持,不鼓励直接使用) | gtest, mbedtls, lua(上游 C 库), ftxui |
由于 xlings 的 defaultNamespace = repo.name(硬编码为索引仓库名 "mcpp-index"),
我们采用每个包显式指定 namespace 的方案,不依赖默认值。
# 模块化库
[dependencies.mcpplibs]
cmdline = "0.0.2"
tinyhttps = "0.2.2"
llmapi = "0.2.5"
# C API 封装
[dependencies.mcpplibs.capi]
lua = "0.0.3"
# 非模块化兼容库
[dependencies.compat]
gtest = "1.15.2"
mbedtls = "3.6.1"
ftxui = "6.1.9"
lua = "5.4.7" # 上游 C 库(和 mcpplibs.capi.lua 是不同的包)当某个 compat 库完成模块化封装后:
- 在 mcpplibs 或 mcpplibs.capi 下发布新包
- compat 版本标记 deprecated(保留一段时间)
- 用户改一行依赖声明即可迁移
文件名使用 <namespace>.<name>.lua 格式:
pkgs/
c/compat.gtest.lua namespace="compat", name="gtest"
c/compat.mbedtls.lua namespace="compat", name="mbedtls"
c/compat.lua.lua namespace="compat", name="lua"
c/compat.ftxui.lua namespace="compat", name="ftxui"
m/mcpplibs.cmdline.lua namespace="mcpplibs", name="cmdline"
m/mcpplibs.tinyhttps.lua namespace="mcpplibs", name="tinyhttps"
m/mcpplibs.llmapi.lua namespace="mcpplibs", name="llmapi"
m/mcpplibs.xpkg.lua namespace="mcpplibs", name="xpkg"
m/mcpplibs.templates.lua namespace="mcpplibs", name="templates"
m/mcpplibs.capi.lua.lua namespace="mcpplibs.capi", name="lua"
package = {
spec = "1",
namespace = "compat", -- 显式 namespace(0.0.6+)
name = "gtest", -- 短名
...
}<namespace>-x-<name>/<version>/
compat-x-gtest/1.15.2/
compat-x-mbedtls/3.6.1/
compat-x-lua/5.4.7/
compat-x-ftxui/6.1.9/
mcpplibs-x-cmdline/0.0.2/
mcpplibs-x-tinyhttps/0.2.2/
mcpplibs.capi-x-lua/0.0.3/
resolve_package_name(name, ns)— 显式 ns 优先 > 点号拆分 > 默认qualified_name(ns, short)— 重建完整名xpkg_dir_name(index, ns, short)— xpkgs 目录名
Package.namespace_字段- TOML
[package].namespace解析 extract_xpkg_namespace()— 从 xpkg lua 读 namespace
install_path() 查找逻辑需要同时支持:
- 新路径:
<namespace>-x-<name>(如compat-x-gtest) - 老路径:
<defaultIndex>-x-<qualifiedName>(如mcpp-index-x-gtest)
- dep 名称匹配走 compat 模块
- lua namespace 传播到 manifest
- 有
namespace字段 → 直接用(新路径) name带点号 → 按首个点拆分(老路径,deprecated in 1.0.0)- 纯短名 → 走
install_path的 fallback 扫描
查 <xpkgs>/<namespace>-x-<name>/<version>/ ← 新路径
查 <xpkgs>/<defaultIndex>-x-<qualifiedName>/<version>/ ← 老路径 fallback
先找到哪个用哪个。新安装的包走新路径,老缓存继续能用。
| 版本 | 变化 |
|---|---|
| 0.0.6 | namespace 字段支持 + 双路 install_path |
| 0.1.0 | mcpp-index 全面迁移到显式 namespace |
| 1.0.0 | 移除 name 嵌点的 compat 拆分逻辑 |