放弃 SDKMAN 和 NVM!在 Garuda Linux + Fish 环境下用 mise 统管全栈开发环境

11 阅读6分钟

放弃 SDKMAN 和 NVM!在 Garuda Linux + Fish 环境下用 mise 统管全栈开发环境

作为一名长期折腾 Linux 的开发者,给系统配置开发环境简直是家常便饭。最近,我准备在我的主力机上(Garuda Linux,Intel i7-1260P,16GB 内存)重新搭建全栈开发环境。

熟悉 Java 和 Node 生态的朋友,第一反应肯定会去装 SDKMANNVM。它们确实是老牌神器,但我看着我那花里胡哨且极为顺手的 fish (4.5.0) 终端,突然意识到一个致命问题:这两大老牌工具原生都是用 Bash 编写的,和 Fish 天生八字不合。

如果在 Fish 里强行用它们,往往需要安装各种复杂的兼容层插件(比如 bassnvm.fish),这不仅严重拖慢终端的启动速度,还会时不时遇到环境变量丢失、全局包找不到等玄学 BUG。

今天这篇博客,就来聊聊在 Arch 系 + Fish Shell 的环境下,如何优雅、无痛地管理 Java、Node 甚至全栈的开发环境,以及我最终为何彻底投入了 mise 的怀抱。

🛠️ 为何选择拥抱 mise

mise(前称 rtx)是用 Rust 编写的下一代开发环境管理器。 相比于 SDKMAN 或系统自带的 archlinux-javamise 具备降维打击般的优势:

  1. 天下武功,唯快不破: Rust 编写,脱离了臃肿的 Shell 脚本,终端启动和版本切换的速度堪称瞬发。
  2. 原生支持 Fish: 不需要任何第三方包装器,修改 PATH 环境变量的底层逻辑让它完美兼容所有现代 Shell。
  3. 全能大管家: 它兼容庞大的 asdf 插件生态。JDK、Maven、Gradle、Node、Python、Go……只要你能叫得出名字的语言和工具,它全都能管!

🚀 极简安装与彻底卸载指南

在 Garuda/Arch 下,AUR 提供了极其方便的打包:

Bash

# 使用 paru 或 yay 安装
paru -S mise

安装完成后,只需要在 Fish 配置文件中加一行代码,让它接管环境:

Bash

# 写入 Fish 配置文件
echo 'mise activate fish | source' >> ~/.config/fish/config.fish

重启终端,准备工作就绪。

(附:强迫症专用的完全卸载指南)

Bash

paru -Rns mise
# 删掉 ~/.config/fish/config.fish 中的初始化代码
# 清理所有环境和缓存(极其重要!)
rm -rf ~/.config/mise ~/.local/share/mise ~/.local/state/mise ~/.cache/mise

⚠️ 首次使用的常见小插曲:usage CLI not found 报错

当你兴冲冲地重启终端,或者敲下第一条 mise 命令准备安装环境时,你极有可能遇到下面这个红色的报错:

Plaintext

Error: usage CLI not found. This is required for completions to work in mise.
See https://usage.jdx.dev for more information.

别慌,这不是你的问题。 这是因为 mise 的作者最近做了一个架构优化,将负责“终端命令自动补全”(就是你敲 Tab 键提示的功能)的引擎独立成了一个叫做 usage 的专用工具。因为刚才我们在 config.fish 里配置了激活脚本,Fish 在启动时尝试加载补全,却发现找不到 usage 这个依赖。

解决方法极其优雅——让 mise 安装它自己需要的依赖即可:

Bash

mise use --global usage

执行完这条命令,报错就会彻底消失,你的终端补全功能也将满血复活。(建议执行完后重启一下终端,或者跑一下 source ~/.config/fish/config.fish 让补全立即生效)。


💻 核心实战:一站式接管全栈生态

有了 mise,你的系统目录(如 /usr/local/bin)将保持绝对的纯净,所有环境都被干净地隔离在 ~/.local/share/mise 中。

场景一:Java 后端生态(JDK + Maven + Gradle)

以前配 Java 环境,最烦的就是手动写 M2_HOME 或者配置环境变量。现在全免了。

1. 全局环境初始化

Bash

# 一键安装最新版 JDK 21,并搭配最新的 Maven 和特定版本的 Gradle
mise use --global java@21 maven@latest gradle@8.5

执行完毕后,直接敲 java -versionmvn -v 就能看到效果,全程无感。

2. 拯救祖传老项目 如果你拉取了一个必须用 Java 8 和老版本 Maven 3.6 的远古项目。只需要进入该项目根目录,执行:

Bash

mise use java@8 maven@3.6

这会在当前目录下生成一个 mise.toml 文件。最神奇的地方来了:以后只要你 cd 进这个目录,JDK 和 Maven 会瞬间自动切换到老版本;一旦离开目录,又会自动恢复成全局的 Java 21。再也不用担心“用错构建工具导致编译失败”了。

场景二:大前端生态(Node + Pnpm / Yarn / Bun)

直接把 NVM 扫进历史垃圾堆,前端环境同样可以一气呵成。

1. 告别全局安装污染 现代前端开发早已不局限于 npm。我们通常会用到 pnpmyarn 甚至 bun。交给 mise 管理,不仅切 Node 版本快,包管理器也能统一管控:

Bash

# 安装最新的 Node LTS 版本,并顺手装上主流包管理器
mise use --global node@lts pnpm@latest yarn@latest bun@latest

2. 苛刻的前端老项目 接手了一个必须用 Node 14 才能 npm install 跑起来的 Vue2 老项目?老规矩,进目录:

Bash

mise use node@14

当前目录的 Node 和自带的 npm 会立刻回退到 14 版本生态,极度优雅。


💡 进阶杀手锏:全栈项目的目录级环境漫游

如果你开发的是一个全栈项目(比如 Spring Boot 后端 + Vue/React 前端),你可以直接在项目的根目录创建一个终极的 mise.toml

Ini, TOML

[tools]
java = "17"
maven = "3.9"
node = "20"
pnpm = "8"

把这个文件提交到 Git 仓库里。以后你的同事拉下代码(甚至如果他们用的是 asdf 时代的 .tool-versions 文件,mise 也能完美兼容读取),只需要敲一行命令,后端到前端的所有指定版本环境就会自动就绪。

其他实用小技巧

  • 查看可用版本: 想查阅远程有哪些 Gradle 版本可以装?用 mise ls-remote gradle
  • 清理磁盘空间: 经常测试各种版本导致硬盘告急?定期执行 mise prune,它会自动帮你删掉那些已经安装但没有任何项目在使用的孤儿版本。

结语

在 Linux 下折腾环境,选择往往比努力更重要。对于 Arch 系 + Fish 这种前卫且追求效率的组合,抛弃历史包袱沉重的 SDKMAN 和 NVM,选择底层逻辑更优秀的 mise,无疑是目前最完美的终极解决方案。

希望这篇记录能帮到同样在配置开发环境的你。你的主力开发环境用的是什么管理工具呢?欢迎在评论区和我交流!