Skip to content

Repository files navigation

libxpkg

xpkg 包描述规范的 C++23 参考实现 — import mcpplibs.xpkg;

CI

libxpkgxpkg 规范 的 C++23 标准库实现,让任何 C++ 工具都能读取、索引和执行 xpkg 格式的包定义,而无需依赖 xlings 本身。

模块

libxpkg 由四个独立的 C++23 子模块组成,按依赖层级排列。可通过聚合 target xpkg 一次引入全部模块(add_deps("xpkg")),也可按需引用单个子模块:

模块 头文件 依赖 功能
mcpplibs.xpkg xpkg.cppm 无外部依赖 数据模型:PackagePackageIndex 等核心类型
mcpplibs.xpkg.loader xpkg-loader.cppm model + lua 解析 .lua 包定义文件,构建包索引
mcpplibs.xpkg.index xpkg-index.cppm model 搜索、别名解析、索引合并
mcpplibs.xpkg.executor xpkg-executor.cppm model + lua 执行包 Lua 钩子(install/config/uninstall)

快速开始

读取包元数据

#include <iostream>
import mcpplibs.xpkg;
import mcpplibs.xpkg.loader;

int main() {
    auto pkg = mcpplibs::xpkg::load_package("path/to/hello.lua");
    if (pkg) {
        std::cout << "name: " << pkg->name << "\n";
        std::cout << "desc: " << pkg->description << "\n";
    }
    return 0;
}

完整生命周期(加载 → 索引 → 搜索 → 安装 → 卸载)

import mcpplibs.xpkg;
import mcpplibs.xpkg.loader;
import mcpplibs.xpkg.index;
import mcpplibs.xpkg.executor;

using namespace mcpplibs::xpkg;

// 1. 加载包
auto pkg = load_package("pkgindex/pkgs/h/hello.lua");

// 2. 构建索引并搜索
auto idx  = build_index("pkgindex/");
auto hits = search(*idx, "hello");

// 3. 创建执行器并运行钩子
auto exec = create_executor("pkgindex/pkgs/h/hello.lua");
ExecutionContext ctx{ .pkg_name = "hello", .version = "1.0.0", ... };
exec->run_hook(HookType::Install,   ctx);
exec->run_hook(HookType::Uninstall, ctx);

完整示例见 examples/lifecycle.cpp

项目结构

libxpkg/
├── src/
│   ├── xpkg.cppm              # mcpplibs.xpkg — 数据模型
│   ├── xpkg-loader.cppm       # mcpplibs.xpkg.loader
│   ├── xpkg-index.cppm        # mcpplibs.xpkg.index
│   ├── xpkg-executor.cppm     # mcpplibs.xpkg.executor
│   ├── xpkg-lua-stdlib.cppm   # Lua 标准库封装(自动生成)
│   └── lua-stdlib/            # 嵌入式 Lua 脚本
├── tests/
│   ├── fixtures/pkgindex/     # 独立测试包索引(无外部依赖)
│   ├── test_model.cpp
│   ├── test_loader.cppm
│   ├── test_index.cpp
│   └── test_executor.cpp
├── examples/
│   ├── basic.cpp              # 最小示例
│   └── lifecycle.cpp          # 完整生命周期演示
├── build.mcpp                 # 构建期由 lua-stdlib/ 生成嵌入式 Lua stdlib
├── .agents/
│   ├── docs/                  # 开发问题排查报告
│   ├── plans/                 # 设计与实现方案
│   └── skills/                # 项目最佳实践
└── mcpp.toml

构建与测试

本库由 mcpp 构建。mcpp 自带受管沙箱(工具链由 mcpp.toml 固定), 不需要手工准备编译器,也不再有 xmake / CMake 构建入口。

xlings install -y   # 装 .xlings.json 里固定的 mcpp
mcpp build
mcpp test

macOS 专用的 elfpatch 用例需要 install_name_tool,在 Linux 上跑不了, CI 里按名字过滤:

mcpp test -- --gtest_filter=-ExecutorTest.ApplyElfpatchAuto_*

Lua stdlib 的生成

src/lua-stdlib/**.lua 是唯一的源码。它需要以裸字符串字面量的形式进二进制, 这一步由 build.mcpp 在构建期完成:生成的 xpkg-lua-stdlib.cppm 写进 MCPP_OUT_DIR,通过 generated= 交给构建,不进版本库

所以改完 .lua 直接 mcpp build 即可,没有"忘记重新生成"这回事 —— 仓库里只有一份拷贝,两份拷贝对不上这种状态不存在。

(它曾经存在过:0.0.47 的 xvm.files 只改了生成物,源 .lua 一直没有。)

CI/CD

GitHub Actions 在 Linux 上构建并测试,工具链由 mcpp 沙箱提供:

平台 构建 状态
Linux (ubuntu-latest) mcpp(沙箱内 GCC) CI

作为依赖引入

在使用方的 mcpp.toml 里声明:

[dependencies]
"mcpplibs.xpkg" = "0.0.48"

相关链接

About

xpkg 规范 的 C++23 标准库实现

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

Generated from mcpplibs/template