Nuupa:不用在终端里迷路的全局依赖更新
有段时间,我总在终端里重复运行全局依赖的更新命令。npm 跑一次,pnpm 再跑一次,偶尔还要看看 Bun。命令结束了,我也看过输出,但过一会儿又会想:到底还有哪些没更新?
这不是什么严重的问题,只是一直让人有点烦。Nuupa 就是我给自己做的答案:把这些零散的信息放到一个小窗口里,不必再靠记忆拼凑终端输出。
真正吸引我的问题也很简单:我能不能借这个小工具认真学一点 Rust,同时做出一个启动快、体积小,而且自己真的会用的桌面应用?
先解决我自己的麻烦
Nuupa 只管全局安装的 npm、pnpm 和 Bun 包。它会检测本机有哪些包管理器,列出已安装版本和最新版本,也可以单独更新某个包,或者按顺序执行“全部更新”。执行时能看到进度,也能把不想动的包排除掉。
我刻意没有把它做成包管理宇宙的总控制台。项目依赖、锁文件和工作区有各自更合适的工具。Nuupa 处理的就是那个很窄的场景:我想快速看清全局环境现在是什么状态,然后决定要更新什么。
如果使用 nvm,它也会尽量识别相应环境。不过我不想把“识别到了”写成“从此不可能出问题”。Node 环境本来就可能因为 shell、路径和版本管理方式而变得复杂,桌面应用只是在替我整理它,并没有消灭这些复杂性。
Vue 留在熟悉的一边,Rust 去做后台工作
界面我用了 Vue 3。不是因为它在这里有什么神奇优势,而是因为我熟悉它,和 Tauri 2 接起来也很自然。我不需要一边学习 Rust,一边再给前端增加一层陌生感。
后台工作交给 Rust。检测包管理器、读取版本、启动更新进程,这些事放在那里很合适。对我来说,这比为了“学 Rust”硬造一个示例项目有意思得多。需求是真的,边界也很清楚。代码写错了,我马上就会在自己每天使用的工具里碰到。
我平时的开发工作更多围着 Web 转:文档、编译、测试、SonarQube,还有一长串流水线检查。Nuupa 让我换了口气。写完功能后,GitHub Actions 直接为 macOS arm64/x64、Linux x64/arm64 和 Windows x64 构建安装包。看到一个项目最后变成可以下载、安装、从桌面启动的应用,这种感觉很新鲜。
当然,跨平台打包并不等于轻松。每个系统仍然有自己的路径、权限和命令差异。但这次折腾的结果不是又一个部署到服务器上的页面,而是一个真正待在电脑里的小工具。我很喜欢这种变化。
更新不是魔法
“全部更新”会按顺序执行,而不是一下子同时启动一堆进程。我更愿意这样做。速度未必最夸张,但进度更容易理解,失败时也更容易知道停在了哪里。
取消同样很直接:它会停止当前流程,但不会回滚已经完成的更新。前面三个包更新成功,第四个包执行时取消,前三个不会自动降回旧版本。这个行为不华丽,却比较诚实。包管理器本身没有给我一个可靠的跨工具事务,我也不打算假装有。
我喜欢的
- 它解决的是我反复遇到的真问题,不是为了展示技术栈才编出来的需求。
- Vue 负责我熟悉的界面部分,Rust 让我在有实际反馈的地方慢慢学习。
- 更新过程可见,也可以排除暂时不想碰的包。
- 桌面打包让我暂时离开日常 Web 项目的那套节奏。
我担心的
- 全局包管理器、版本管理器和系统路径组合很多,自动检测永远会有边角情况。
- 取消没有回滚,用户需要知道已经完成的更新会保留。
- 跨平台安装包能构建出来,不代表每一种机器环境都已经被我覆盖。
- 项目里的版本信息可能分散在前端配置和 Tauri/Cargo 文件中,因此我不想轻率地宣称所有地方永远完全同步。
目前的判断
Nuupa 不是一个宏大的项目,这反而是我喜欢它的地方。它把一个每天可能只浪费几分钟、却总会重复出现的小麻烦,变成了一个我愿意打开的桌面应用。
我也终于找到了一种比较舒服的 Rust 学习方式:不从语法清单开始,而是让它承担真实工作,碰到问题再往下挖。现在的 Nuupa 还有不少边角可以打磨,但它已经替我记住了那些我总会忘掉的全局依赖。这就够它继续留在我的电脑里。