在服务器上装软件,目前有两条路。
一条是系统包管理器,Debian 系用 apt,CentOS 系用 yum。
一条是语言生态的包管理器,比如 Node.js 的 npm,Rust 的 cargo。
MoonBit 的 moon 属于后者,但它的能力,又比一般的包管理器多走了一步。
什么是 moon?
它是 MoonBit 的包管理器,地位相当于 Node.js 里的 npm,Rust 里的 cargo。
它把一个软件的 下载、编译、安装、升级,做成了一条龙闭环。
你要装一个 MoonBit 写的工具,只需要一条命令,它自己会去下载源码,自己编译,自己把编译好的二进制放到指定目录。
安装 bm2
bm2 是基于 MoonBit 实现的Node.js & Bun 的进程管理器,用来替代 pm2。
它在 mooncakes 上发布之后,服务器上安装只需要三步。
第一步,安装 MoonBit
arduino
curl -fsSL https://cli.moonbitlang.cn/install/unix.sh | bash
第二步,更新索引
bash
moon update
# Registry index cloned successfully
# Symbols updated successfully
第三步,安装 bm2
shell
moon install chensuiyi/bm2/... --bin ~/.local/bin
# Downloading chensuiyi/bm2@0.2.1
# Downloading moonbitlang/x@0.4.41
# Downloading bobzhang/toml@0.4.2
# Finished. moon: ran 17 tasks, now up to date
# Success: Installed `bm2` to `/root/.local/bin/bm2`
# Success: Installed `bm2d` to `/root/.local/bin/bm2d`
然后 bm2 version,就能看到装好的版本了。
整个流程,前后不到一分钟。
两条路各自的特点
apt 和 yum 装的是编译好的二进制包,直接下载解压到系统目录。
好处是安装快,不需要编译环境,而且包和系统深度集成,依赖关系由系统统一管理。
moon 装的是源码包,在本地服务器上现场编译。
好处是产物天然适配当前机器的架构和系统版本,不需要维护多套预编译产物。
还有一个差异是版本时效。
apt 和 yum 仓库里的软件版本,一般比官方发布晚一些,因为仓库维护需要时间,稳定性优先。
mooncakes 上的版本,作者发布后就能装到,时效性更强。
这两种方式没有谁好谁坏,定位不同而已。
更新的方式也不同
apt 和 yum 的更新,走的是系统统一的升级流程,apt upgrade 一把梭,把所有软件包一起更新。
好处是省心,系统里所有包的状态一目了然。
moon 的更新,是重跑一遍安装命令。
bash
moon install chensuiyi/bm2/... --bin ~/.local/bin
它会自动检测新版本,只编译有变化的部分,然后原子替换旧文件。
速度怎么样
现场编译,听起来比下载二进制慢,但 moon 有增量缓存机制。
第一次安装,要全量编译,也就几十秒。
第二次更新,只编译变化的部分,基本是秒级。
而且编译好的产物有缓存,装多个项目时,公共依赖编译一次,后面全部复用。
什么场景适合moon
分析下来,moon 适合的应用场景,其实比较明确。
首先是架构敏感的工具。
服务器从 x86 换到 arm,或者反过来,apt 和 yum 的预编译包可能没有对应版本,moon 的本地编译则不存在这个问题。
其次是追求版本时效的场景。
有些工具需要尽快用上新版特性,mooncakes 发版即所得,比等系统仓库更新更快。
再次是语言生态内的工具。
MoonBit 写的工具,天然在 mooncakes 上分发,用 moon 安装是顺理成章的路径。
那 apt 和 yum 呢?
系统内核、系统库、基础服务,这些依然离不开系统包管理器。
它们的依赖和系统深度绑定,moon 也不具备替代的条件。
所以更准确的说法是,moon 在应用层工具这个范围内,可以部分替代 apt 和 yum,系统层的东西,还是各司其职。
未来会怎样
MoonBit 生态还在早期,mooncakes 上的工具数量还不多,但方向是明确的。
语言生态成熟之后,应用层的命令行工具,用 moon install xxx 安装,会成为常态。
到时候,装一个进程管理器,一条命令,装一个抓包工具,一条命令,装一个日志分析工具,还是一条命令。
系统包管理器管系统,语言包管理器管应用,两条路并行,各干各的。
你觉得这个分工合理吗?
欢迎在评论区聊聊你的看法。