告别环境混乱!使用 mise 管理你的开发环境
设想一个很常见的场景,你接手了一个新项目,它依赖于一些外部的命令行工具,这就需要你提前安装好它们,不然项目跑不起来。如果是多人协同开发的项目,还会涉及到每个人安装的版本号不一致的问题。
其实解决方案早已经有了,比如 Docker 为首的容器方案、Nix 包管理方案等等。但是各有各的缺点,容器方案主要是太重了,占用系统资源太多,实在是太慢,反而拖慢了开发效率;而 Nix 包管理方案的包是社区维护的,这里的坑是有些包的活跃度太低,更新频率并不高,你还真不一定下载得到你需要的版本。
所以今天,我要介绍一套新方案,那就是 mise。在这篇文章中,我将会通过实际例子带你学会使用 mise。
mise 安装
在讲如何使用 mise 之前,我们先安装下 mise,如下所示:
shell
# 自动化脚本安装
curl https://mise.run | sh
# Linux/macOS(Homebrew)
brew install mise
# Windows(WinGet)
winget install jdx.mise
安装完成后,需要配置 Shell:
shell
# bash
echo 'eval "$(mise activate bash)"' >> ~/.bashrc
# zsh
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
# fish
echo 'mise activate fish | source' >> ~/.config/fish/config.fish
# PowerShell
# 将以下内容添加到你的 PowerShell 配置文件中:
# (&mise activate pwsh) | Out-String | Invoke-Expression
插件管理
mise 通过多后端(Backend)作为源检索源,检索插件下载对应的命令行工具。core 是 mise 官方自己维护的 Backend,内置在 mise 当中,通过下面的命令就能知道 Backend 维护了哪些插件。
shell
mise registry -b core
# Tool Backends
# bun core:bun
# deno core:deno
# dotnet core:dotnet
# dotnet-core core:dotnet
# elixir core:elixir
# erlang core:erlang
# go core:go
# java core:java
# node core:node
# python core:python
# ruby core:ruby
# rust core:rust
# swift core:swift
# zig core:zig
除此之外,还有 cargo、vfox、aqua、npm、github、pipx 等 Backend。
需要特别说明的是,mise 才采取了非常严格的集中式插件维护模式,这是为了避免插件无人维护、恶意代码、供应链攻击等问题。这套维护模式由创始人 Jeff Dickey 主导,采取了严格的准入门槛,所以使用起来还是比较放心的。如果你想参与贡献的话,可以查看文档。
至于完整的插件列表,可以查看 mise versions。

全局命令行工具管理
这是我最常用的一个功能,可以全局安装命令行工具,比如 bun、protobuf,同时还能指定安装的版本号,反正我已经将一部分命令行工具从 Homebrew 迁移到 mise 上来管理了。
shell
# 全局安装 --global,默认为 latest 版本
mise use --global bun
# 指定安装版本
mise use --global bun@1.2.23
# 删除版本
mise uninstall bun@1.2.23
# 查看安装版本列表
mise ls bun
# 更新包版本并更新配置文件
mise upgrade --bump
我补充一个使用技巧,你全局安装的包会被记录在
plaintext
$XDG_CONFIG_HOME/mise/config.toml
这意味着我们可以将这个文件纳入 Dotfiles 管理,在新的环境中只需要执行以下的命令,就安装环境了。
shell
mise install
项目级环境隔离
除了能全局安装命令行工具,mise 的另一个最重要的功能就是项目级环境隔离,就像 pyenv 这类工具一样,同时也是文章开头提到的开发场景,用 mise 就能轻易解决。
比方说,我们当前这个项目需要使用的是 1.2.23 这个版本的 bun,和之前一样使用 mise use,只是这次不需要 --global 参数,在项目根目录执行:
shell
mise use bun@1.2.23
这时候,我们会看到项目根目录自动生成了一个文件 mise.toml,内容为:
toml
[tools]
bun = "1.2.23"
在项目根目录的终端执行也是我们指定的安装的 bun 版本:
shell
bun --version
# 1.2.23
在多人协同开发时,如果你想版本被固定下来,即使是进行 upgrade 也不会去更新,可以执行 lock 操作,在项目根目录执行:
shell
mise lock
它会生成一个 mise.lock 文件,把版本固定下来。
环境变量自动管理
除了能管理命令行工具,mise 还能管理环境变量。你可以在 mise.toml 中配置当前项目需要用到的环境变量。
toml
[env]
NODE_ENV = 'production'
我们执行下面的命令就能打印出来这个环境变量了:
shell
mise exec -- echo $NODE_ENV
# production
不过这种方式我比较少用,我倾向于使用 env 文件,依旧是配置 mise.toml。
toml
[env]
_.file = ['.env']
它会自动去加载 .env 文件中的环境变量配置。更详细的用法推荐查看文档。
简单的任务管理
mise 的任务管理相对比较简单,类似于 npm scripts。虽然简单,不过对于小项目来说足够了,复杂项目建一步到位,直接使用 just。这里简单讲一下 mise 的任务管理。编辑 mise.toml:
toml
[tasks.build]
description = "Build the CLI"
run = "cargo build"
这里的意思是定义一个任务 build,要运行这个任务执行命令:
shell
mise run build
更详细的用法推荐查看文档。
结语
可以说,mise 是一个非常全面的工具,对于我来说,它起到 Homebrew + Docker 容器 + dotenv + 简单的任务管理功能。不过从我个人实际开发的角度来说,能起到 Homebrew + Docker 容器的作用就够了。其他的功能,我更推荐使用 just,毕竟功能更加强大。