|
| 1 | +# Namespace Field Design — mcpp 0.0.6 |
| 2 | + |
| 3 | +> 方案设计文档,指导 namespace 字段的实现和生态迁移。 |
| 4 | +
|
| 5 | +## 1. 动机 |
| 6 | + |
| 7 | +mcpp 生态向 C++23 模块化方向发展。包索引中存在两类库: |
| 8 | + |
| 9 | +- **模块化库**(mcpplibs 生态):原生 `export module`,用 `import` 消费 |
| 10 | +- **非模块化库**(compat):传统 C/C++ 库,通过 Form B 描述文件 + `#include` 消费 |
| 11 | + |
| 12 | +需要在 namespace 层面区分这两类,让用户一眼看出某个依赖是否是模块化的, |
| 13 | +同时为未来"非模块化库迁移到模块化"提供清晰的升级路径。 |
| 14 | + |
| 15 | +## 2. 命名空间划分 |
| 16 | + |
| 17 | +| namespace | 含义 | 示例包 | |
| 18 | +|---|---|---| |
| 19 | +| `mcpplibs` | mcpplibs 生态的模块化 C++23 库 | cmdline, tinyhttps, llmapi, xpkg, templates | |
| 20 | +| `mcpplibs.capi` | mcpplibs 的 C API 模块化封装子集 | lua (封装 Lua C API 为 C++23 module) | |
| 21 | +| `compat` | 非模块化的第三方 C/C++ 库(兼容性支持,不鼓励直接使用) | gtest, mbedtls, lua(上游 C 库), ftxui | |
| 22 | + |
| 23 | +### 2.1 默认 namespace |
| 24 | + |
| 25 | +由于 xlings 的 `defaultNamespace = repo.name`(硬编码为索引仓库名 `"mcpp-index"`), |
| 26 | +我们采用**每个包显式指定 namespace** 的方案,不依赖默认值。 |
| 27 | + |
| 28 | +### 2.2 用户 mcpp.toml 写法 |
| 29 | + |
| 30 | +```toml |
| 31 | +# 模块化库 |
| 32 | +[dependencies.mcpplibs] |
| 33 | +cmdline = "0.0.2" |
| 34 | +tinyhttps = "0.2.2" |
| 35 | +llmapi = "0.2.5" |
| 36 | + |
| 37 | +# C API 封装 |
| 38 | +[dependencies.mcpplibs.capi] |
| 39 | +lua = "0.0.3" |
| 40 | + |
| 41 | +# 非模块化兼容库 |
| 42 | +[dependencies.compat] |
| 43 | +gtest = "1.15.2" |
| 44 | +mbedtls = "3.6.1" |
| 45 | +ftxui = "6.1.9" |
| 46 | +lua = "5.4.7" # 上游 C 库(和 mcpplibs.capi.lua 是不同的包) |
| 47 | +``` |
| 48 | + |
| 49 | +### 2.3 迁移路径 |
| 50 | + |
| 51 | +当某个 compat 库完成模块化封装后: |
| 52 | +1. 在 mcpplibs 或 mcpplibs.capi 下发布新包 |
| 53 | +2. compat 版本标记 deprecated(保留一段时间) |
| 54 | +3. 用户改一行依赖声明即可迁移 |
| 55 | + |
| 56 | +## 3. 索引文件布局 |
| 57 | + |
| 58 | +### 3.1 描述文件命名 |
| 59 | + |
| 60 | +文件名使用 `<namespace>.<name>.lua` 格式: |
| 61 | + |
| 62 | +``` |
| 63 | +pkgs/ |
| 64 | + c/compat.gtest.lua namespace="compat", name="gtest" |
| 65 | + c/compat.mbedtls.lua namespace="compat", name="mbedtls" |
| 66 | + c/compat.lua.lua namespace="compat", name="lua" |
| 67 | + c/compat.ftxui.lua namespace="compat", name="ftxui" |
| 68 | + m/mcpplibs.cmdline.lua namespace="mcpplibs", name="cmdline" |
| 69 | + m/mcpplibs.tinyhttps.lua namespace="mcpplibs", name="tinyhttps" |
| 70 | + m/mcpplibs.llmapi.lua namespace="mcpplibs", name="llmapi" |
| 71 | + m/mcpplibs.xpkg.lua namespace="mcpplibs", name="xpkg" |
| 72 | + m/mcpplibs.templates.lua namespace="mcpplibs", name="templates" |
| 73 | + m/mcpplibs.capi.lua.lua namespace="mcpplibs.capi", name="lua" |
| 74 | +``` |
| 75 | + |
| 76 | +### 3.2 描述文件格式 |
| 77 | + |
| 78 | +```lua |
| 79 | +package = { |
| 80 | + spec = "1", |
| 81 | + namespace = "compat", -- 显式 namespace(0.0.6+) |
| 82 | + name = "gtest", -- 短名 |
| 83 | + ... |
| 84 | +} |
| 85 | +``` |
| 86 | + |
| 87 | +### 3.3 xpkgs 安装目录 |
| 88 | + |
| 89 | +``` |
| 90 | +<namespace>-x-<name>/<version>/ |
| 91 | +
|
| 92 | +compat-x-gtest/1.15.2/ |
| 93 | +compat-x-mbedtls/3.6.1/ |
| 94 | +compat-x-lua/5.4.7/ |
| 95 | +compat-x-ftxui/6.1.9/ |
| 96 | +mcpplibs-x-cmdline/0.0.2/ |
| 97 | +mcpplibs-x-tinyhttps/0.2.2/ |
| 98 | +mcpplibs.capi-x-lua/0.0.3/ |
| 99 | +``` |
| 100 | + |
| 101 | +## 4. mcpp 实现清单 |
| 102 | + |
| 103 | +### 4.1 src/pm/compat.cppm (已完成 PR #23) |
| 104 | + |
| 105 | +- `resolve_package_name(name, ns)` — 显式 ns 优先 > 点号拆分 > 默认 |
| 106 | +- `qualified_name(ns, short)` — 重建完整名 |
| 107 | +- `xpkg_dir_name(index, ns, short)` — xpkgs 目录名 |
| 108 | + |
| 109 | +### 4.2 src/manifest.cppm (已完成 PR #23) |
| 110 | + |
| 111 | +- `Package.namespace_` 字段 |
| 112 | +- TOML `[package].namespace` 解析 |
| 113 | +- `extract_xpkg_namespace()` — 从 xpkg lua 读 namespace |
| 114 | + |
| 115 | +### 4.3 src/pm/package_fetcher.cppm (待更新) |
| 116 | + |
| 117 | +`install_path()` 查找逻辑需要同时支持: |
| 118 | +- 新路径: `<namespace>-x-<name>`(如 `compat-x-gtest`) |
| 119 | +- 老路径: `<defaultIndex>-x-<qualifiedName>`(如 `mcpp-index-x-gtest`) |
| 120 | + |
| 121 | +### 4.4 src/cli.cppm (已完成 PR #23) |
| 122 | + |
| 123 | +- dep 名称匹配走 compat 模块 |
| 124 | +- lua namespace 传播到 manifest |
| 125 | + |
| 126 | +## 5. 向后兼容 |
| 127 | + |
| 128 | +### 5.1 compat.cppm 的三条规则 |
| 129 | + |
| 130 | +1. 有 `namespace` 字段 → 直接用(新路径) |
| 131 | +2. `name` 带点号 → 按首个点拆分(老路径,deprecated in 1.0.0) |
| 132 | +3. 纯短名 → 走 `install_path` 的 fallback 扫描 |
| 133 | + |
| 134 | +### 5.2 install_path 双路查找 |
| 135 | + |
| 136 | +``` |
| 137 | +查 <xpkgs>/<namespace>-x-<name>/<version>/ ← 新路径 |
| 138 | +查 <xpkgs>/<defaultIndex>-x-<qualifiedName>/<version>/ ← 老路径 fallback |
| 139 | +``` |
| 140 | + |
| 141 | +先找到哪个用哪个。新安装的包走新路径,老缓存继续能用。 |
| 142 | + |
| 143 | +## 6. 弃用时间线 |
| 144 | + |
| 145 | +| 版本 | 变化 | |
| 146 | +|---|---| |
| 147 | +| 0.0.6 | namespace 字段支持 + 双路 install_path | |
| 148 | +| 0.1.0 | mcpp-index 全面迁移到显式 namespace | |
| 149 | +| 1.0.0 | 移除 name 嵌点的 compat 拆分逻辑 | |
0 commit comments