mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1687 字
4 分钟
NebulaShell 开发血泪史——从「能跑就行」到「好像能看了」
2026-05-10

一切的源头#

翻 git log,最早的提交是四月底。

那时候它还叫 FutureOSS,一个听起来很牛但实际上啥也不是的名字。代码基本靠 AI 生,逻辑基本靠猜,能跑全靠运气。

我那时候的想法很简单:我想要一个插件化的运行时框架,什么功能都通过插件加。 想法挺好,但实现嘛……提交信息写的是「完成阶段2」,实际上连阶段1都站不稳。


第一个分水岭:v1.1.0#

4月24号,我搞了个大版本。

加了进程隔离、安全网关、防火墙、运维工具箱、FTP 服务器、多语言部署编排器……功能列表看着挺唬人。实际上这些插件大多只有一个壳——路由是空的(pass),方法返回是错的,_load() 方法在清空数据而不是加载数据。

但有一件事我做对了:安全架构。

进程隔离是真的,AES-256-GCM 加密是真的,三层签名也是真的。那段时间我可能看了太多安全相关的文章,满脑子都是「不能让人轻易搞穿我的项目」。

于是 NBPF 包格式诞生了——一个插件打包格式,加密层数比功能还多。


至暗时刻:「修复P0级问题:40+文件语法错误」#

4月25号的提交信息很诚实:「修复了若干Bug」

然后第二天:「修复P0级问题:40+文件语法错误 + import路径 + 清理废弃代码」

40 个文件都有语法错误。import 路径全是错的。我不知道当时是怎么让这些代码「跑起来」的,可能是运气吧。

这一天我干了一件事:把整个项目的代码一个一个文件看过去,修语法错误,改 import 路径,删了一大堆不知道从哪来的废弃代码。

提交信息里的「🔧」表情现在看起来格外讽刺。


塞彩蛋:成就系统#

4月26号我加了一个成就系统

藏在 !! 前缀后面。你在 CLI 里输入 !!help 就能看到。有各种奇奇怪怪的成就:

  • 凌晨两点打开项目 → 解锁「夜猫子」
  • 加载 20 个以上插件 → 解锁「插件收集者」
  • 连续启动失败再恢复 → 解锁「崩溃幸存者」
  • 在 CLI 输入经典秘籍指令 → 解锁「上上下下左右左右BA」

还有个 !!stats 可以看你的成就进度。!!export 导出成就截图去装逼。

这个功能跟框架本身毫无关系,但我做得很开心。写代码嘛,总得给自己找点乐子。


改名 NebulaShell#

5月2号,我把项目从 FutureOSS 改成了 NebulaShell

原因很简单:FutureOSS 这名字太中二了,而且跟项目实际做的事情对不上。NebulaShell 至少听起来像是「一个有点技术含量的东西」。

同一天我还开始搞 TUI(终端界面),做了个双 UI 架构——Web 管理界面和终端界面可以同时用。后来因为懒,TUI 做到一半就搁置了。预留接口 的意思是「我也不知道啥时候会继续做」。


那场大规模重构#

5月3号到5月5号是项目变动最大的三天。

先是 「docs: 创建文档目录 + 更新LICENSE + 规范项目文档」——我终于开始写文档了。SVG 架构图、分层图、数据流图,画了一大堆。代码能不能跑先不说,图要好看。

然后是 「核心迁移至 oss/core + NBPF 多重签名加密 + NIR 编译器 + README 全面升级」

这次重构把核心代码从插件体系里抽了出来,变成了独立的 oss/core/engine.py。之前核心功能本身也是一个插件(“用插件加载插件”),听起来很酷但实际维护起来很蛋疼——插件加载器还没加载完,你怎么让它去加载自己?

NIR(Nebula Intermediate Representation)也是这时候加的。说白了就是把 Python 代码 compile() 成 code object 然后序列化保存,实现所谓的「一次编译,到处运行」。其实就是 Python 自己本来就支持的功能,我给它包装了一下起了个看起来很专业的名字。


代码审查:当头一棒#

5月4号我做了一次全面的代码审查。结果挺难看的:

  • 4 个 CRITICAL 级别问题:路径穿越漏洞、方法实现完全错误、路由空实现、空指针
  • 3 个 HIGH 级别问题:代码审查器自己就不可用、多处未定义变量
  • 总共 19 个问题

plugin-storage 的代码尤其惨——_resolve_path 方法完全忽略了传入的路径参数,不管你要读什么文件都返回同一个目录。get() 方法实际上在做 set() 的操作。keys() 方法在清空数据。_load() 方法在覆写文件而不是加载文件。

每个方法的实现都和它的名字完全相反。

看到这份报告的时候我沉默了十分钟。然后默默建了一个 FATAL_FIXES_REPORT.md


项目的未来#

现在项目到了 v2.0(虽然 pyproject.toml 里写的还是 1.2.0)。

代码从最早的一堆烂摊子,到现在核心引擎 1700+ 行,NBPF 加密系统 600+ 行,NIR 编译器 300+ 行。虽然还有很多空实现和 pass,但至少架构是清晰的了。

后续计划里写着要与 Passnux 项目整合,全面技术重构。听起来又是一个大工程——希望这次不用再修 40 个文件的语法错误。


写在最后#

翻完 NebulaShell 的整个 git 历史,我发现一个规律:这个项目每一次大进步,都是因为看到了自己代码有多烂。

第一次重构是因为 40 个文件都有语法错误。第二次重构是因为代码审查查出了 19 个问题。下次重构可能是因为什么?我还挺期待的。

starlight-apk
/
NebulaShell
Waiting for api.github.com...
00K
0K
0K
Waiting...
git clone https://github.com/starlight-apk/NebulaShell.git

「写代码最可怕的不是有 bug,而是你觉得自己写得挺好的。」

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

NebulaShell 开发血泪史——从「能跑就行」到「好像能看了」
https://www.starlight-apk.cn/posts/project/nebulashell/nebulashell-dev-story/
作者
Starlight-apk
发布于
2026-05-10
许可协议
Apache License 2.0

部分信息可能已经过时

目录