本文件为 AI 编码助手在此仓库中工作时提供指引。
Lua 侧 API 见
skills/SKILL.md——只有模块索引与跨模块约定,签名一律以meta/*.lua为准,行为与示例看test/。
bee.lua 是一个跨平台 Lua 扩展库,为 Lua 5.4 和 5.5 提供系统级原生绑定,封装了异步 I/O、网络、子进程管理、多线程、文件监控等操作系统 API,以统一的 Lua 接口对外暴露。
项目使用 luamake(基于 Lua 的构建系统),底层依赖 Ninja。
luamake # 编译 + 测试
luamake -notest # 只编译,跳过测试
luamake -EXE lua # 同时构建 Lua 可执行文件
luamake -arch x86_64 # 指定目标架构
luamake -mode debug # Debug 构建(默认 release)
luamake -sanitize # 开启 address sanitizer
luamake --analyze # 静态分析luamake test # 只测试(不重新编译)
luamake test -v # 只测试,详细输出
luamake test -v <pattern> # 只运行名称匹配 pattern 的测试用例测试文件位于 test/,使用 ltest 框架。入口 test/test.lua 会按平台加载对应的测试文件。
- 每次完成代码修改后,必须先
luamake -notest编译,再luamake test -v运行全量测试,确保全部通过后才能结束任务。 - 新增或修改 API 时,必须同步更新
meta/目录下对应的 LuaLS 类型注解文件。 - 新增 API 时,必须同步在
test/目录下对应的测试文件中增加测试用例。 - 调试单个测试用例时,可用
luamake test -v <pattern>快速定位,最终仍须全量测试通过。 - 测试失败时,必须修复代码直至全部通过,不得跳过或忽略失败的测试。
luamake lua compile/clang-format.lua # 用 clang-format 格式化 C++ 代码Lua 用户代码
└── Lua 运行时 (3rd/lua54/ 或 3rd/lua55/)
└── binding/lua_*.cpp ← C++ ↔ Lua FFI 桥接层(每模块一个文件)
└── bee/*.cpp/h ← 核心 C++ 库(平台无关抽象)
└── 操作系统 API ← IOCP / io_uring / GCD / kqueue / epoll
-
bee/— 核心 C++ 库,每个子目录对应一个功能域:bee/net/— Socket、网络端点、IP 工具bee/async/— 平台原生异步 I/O(Windows: IOCP,Linux: io_uring/epoll,macOS: GCD)bee/subprocess/— 子进程管理,支持 stdin/stdout/stderr 管道bee/filewatch/— 文件系统监控(inotify / FSEvents / ReadDirectoryChangesW)bee/thread/— 线程、自旋锁、原子操作、信号量bee/lua/— Lua 绑定基础设施(binding.h、module.h、错误处理)bee/sys/— 路径、文件句柄、错误码的平台抽象bee/crash/— 栈展开与崩溃报告
-
binding/— 每个模块对应一个lua_*.cpp,负责注册 Lua 模块、类型转换和 userdata 生命周期管理。 -
compile/— 用 Lua 编写的构建配置。common.lua包含编译器标志和 Lua 版本选择;make.lua是入口。 -
meta/— EmmyLua 类型注解,供 IDE 使用,记录每个bee.*模块的公开 API。 -
test/— 每个模块一个测试文件,均为 Lua 脚本。 -
3rd/— 第三方依赖:lua54/、lua55/、fmt/(格式化)、filesystem.h(backport)、lua-seri(序列化)。 -
bootstrap/— 预加载 bee 库的独立启动器可执行文件。
平台差异尽量通过文件命名而非 #ifdef 来区分。例如异步 I/O 拆分为独立文件:
async_uring_linux.cpp— Linux (io_uring)async_epoll_linux.cpp— Linux (epoll 回退)async_macos.cpp— macOS (GCD)async_win.cpp— Windows (IOCP)
socket、subprocess、thread、async、filesystem、filewatch、channel、epoll、select、serialization、time、crash、debugging、platform、sys、windows
vendored 的 Lua 源码有两类补丁,均位于 3rd/lua-patch/:
1. 始终编译的内联补丁(Lua 5.4 和 5.5 均适用,无开关):
- Windows 上支持 ANSI 转义码
- Windows 上使用 UTF-8 字符串编码
- Windows 上使用快速 setjmp
- 错误/resume/yield 钩子(供调试器使用)
- Debug 模式下禁用尾调用
- Debug 构建中启用
lua_assert
2. 构建期 git apply 补丁(通用补丁基础设施):
构建时始终将官方 Lua 源码整树复制到 $builddir/patched/lua<ver>/,再依次应用启用的补丁(apply_lua_patch 目标,无条件构建;无启用补丁时退化为纯复制,不调用 git)。补丁按约定放在 3rd/lua-patch/<name>/lua<ver>.patch(例如 3rd/lua-patch/optchain/lua55.patch)。
新增一个此类补丁的步骤:
- 在
3rd/lua-patch/<name>/下为每个目标 Lua 版本放置lua<ver>.patch(git diff格式,即git apply可直接应用的补丁文件); - 在
compile/common.lua的lua_patches清单中注册一行{ flag = "<flag>", dir = "<name>" }。flag是可选的命令行开关(默认关闭):luamake -<flag>即启用该补丁;若补丁无需开关(始终启用),可省略flag字段。
补丁按清单顺序应用,后一个补丁可覆盖前一个补丁的修改。整树复制使 #include 始终解析到补丁目录内的文件(补丁版或原样版),新增补丁无需关心它触及哪些文件,构建代码零改动;开关切换时构建脚本会自动重写产物并清理补丁遗留文件。注意:有补丁启用时构建需要 PATH 上有 git。
测试平台覆盖:Windows(x86、x86_64、Clang、MinGW)、macOS(多版本,Intel+ARM)、Linux(Ubuntu 22.04/24.04、ARM)、FreeBSD、OpenBSD、NetBSD,以及通过 QEMU 运行的 ARMv7/RISC-V。详见 .github/workflows/test.yml。