跳转到内容

Mise

Mise 是个用来管理工具链版本和切换环境的工具,也可以充当任务运行器。

作为工具链管理器,Mise 可以替代许多工具,比如 nvmpyenv 等。这些程序通常只用来管理一个工具的版本,而 Mise 可以管理多种工具的版本。你可以在 Mise Registry 上查看 Mise 能够管理的所有工具。如果你正在使用多个不同工具的版本管理器,那么 Mise 可能非常适合你,它让你不再需要记忆每种工具的用法,只需知道 Mise 怎么用就行了。

作为环境切换工具,Mise 是 direnv 的替代品。功能很简单,就是修改 环境变量 而已。对于部分工具,比如 Python,Mise 还能在进入目录时自动激活虚拟环境。

作为任务运行器,Mise 通过 toml 定义任务,语法和 MakeJust 差异很大。作为写习惯了 Make 的人,我还是更喜欢 Just,它改善了 Make 且语法类似。不过,大多数时候使用 Mise 也很方便。

Terminal window
# Windows
scoop install mise

环境变量 MISE_DATA_DIR 决定了 Mise 的数据保存在哪里。

Mise 的一些功能需要与 Shell 集成(官方说法是激活)后才能使用。你可以阅读 官方文档 了解如何激活 Mise

Terminal window
# pwsh
(&mise activate pwsh) | Out-String | Invoke-Expression
# bash
eval "$(mise activate bash)"
# zsh
eval "$(mise activate zsh)"

在上述激活方式中,Mise 通过修改 PATH 切换运行时版本。Mise 还有另一种切换运行时版本的方式,就是修改 Shims,它和修改 PATH 的方法略有不同,详细的比对可参考 官方文档

PATH 更适合交互式 Shell 环境,而 Shims 推荐用于非交互式环境。同时使用二者也没有问题。使用 Shims 的方式就是在把 $MISE_DATA_DIR/shims 目录添加到 PATH 中。

Mise 可以用来管理多种编程语言运行时的不同版本,也可以用来管理本地开发工具的不同版本。

Mise 会自动更新 PATHShims 以确保你使用了正确的版本,不过该功能需要激活。

Mise 可以更改全局使用的运行时版本

Terminal window
# 全局使用 python latest
mise use -g python
# 全局使用 nodejs lts
mise use -g node@lts
# 全局使用 java 17
mise use -g java@17

这会修改 ~/.config/mise/config.toml 文件,添加类似这样的内容

[tools]
java = "17"
node = "lts"
python = "latest"

也可以更改当前项目使用的运行时版本

Terminal window
# 当前项目使用 nodejs 20
mise use node@20

这会在当前目录下创建 mise.toml 文件,并添加如下内容

[tools]
node = "20"

如果激活了 Mise,则只要处于这个项目中,Mise 就会自动使用这个运行时的版本。

有些需要全局使用的 CLI 工具不在系统包管理器中,必须通过其它包管理器获取,或手动去资源发布处下载并安装。此时可以使用 Mise 统一管理这些 CLI 工具,而不必记忆每种工具的安装方式。

不过 Mise 并不直接管理 CLI 工具,而是借助被称为后端的包管理器或生态系统。所有可用的后端可以在 官方文档 中查看。

我主要使用 Mise 管理 Python 和 NodeJS 生态的 CLI 工具。个人偏爱 Rust 写的工具,因此先用 Mise 安装相关的包管理器 uvaube

Terminal window
# 安装 uv
mise use -g uv
# 安装 aube
mise use -g aube

这会在文件 ~/.config/mise/config.toml 中添加如下内容

[tools]
aube = "latest"
uv = "latest"

然后在 ~/.config/mise/config.toml 中更改配置,以替代 pipxnpm 后端的默认工具

[settings.pipx]
uvx = true
[settings.npm]
package_manager = "aube"

然后正常安装工具即可

Terminal window
mise use -g npm:@mermaid-js/mermaid-cli
mise use -g pipx:argostranslate

对于 pipx 后端,如果安装工具时存在额外依赖,那么要先在 ~/.config/mise/config.toml 中描述工具的安装需求

[tools]
"pipx:markitdown" = { version = "latest", extras = "all" }

然后再安装

Terminal window
mise use -g pipx:markitdown

mise 会自动在当前 shell 会话中设置环境变量,这个功能同样需要激活。

Terminal window
# 进入当前项目后自动设置
mise set NODE_ENV=production

这会在 mise.toml 中添加如下内容

[env]
NODE_ENV = "production"

有一些环境变量比较特殊,比如 _.python.venv。若将其设置为虚拟环境的路径,mise 就会在进入项目目录后自动激活虚拟环境 不过这样似乎无法通过 deactivate 退出虚拟环境了

[env]
_.python.venv = "venv" # 这是虚拟环境的相对路径

你可以在 这里 找到更多的特殊环境变量

此外,也可以用 mise 管理全局环境变量。相比写入 ~/.bashrc / ~/.zshrc 等方案,mise 可以更好的跨 Shell 同步。

Terminal window
mise set --global EDITOR="code --wait"

可以通过 mise tasks add build -- mkdocs build 设置任务,这会在 mise.toml 中添加如下内容

[tasks.build]
run = "mkdocs build"

当然也可以直接在该文件里手写任务,并且可以单独设置环境变量、添加描述信息等,如下所示

[tasks.build]
description = "Build the website" # 添加描述信息
env = { "MY_VAR" = "my variable" } # 添加环境变量
run = "mkdocs build"

mise run build 就可以运行 build 任务,mise tasks ls 会显示所有的任务,以及对应的描述信息

Mise 允许在语言运行时更新后,自动安装一些包。比如对于 NodeJS,可以在 ~/.default-npm-packages 中写入

lodash
request
express

这种默认安装适合那些需要全局使用通用编程库,而非命令行工具。后者可能用 mise use -g npm:xxx 更好。

如果希望 Mise 能够支持 .nvmrc.python-version 等惯用的版本声明文件,需要添加一些设置。这样和别人协作时,如果项目里有这些文件,就不需要安装对应的工具,也不需要在项目里添加 mise.toml,实现无感的工具替换。

Terminal window
# 让 mise 能够支持 python 的惯用版本声明文件
mise settings add idiomatic_version_file_enable_tools python
# 让 mise 能够支持 node / pnpm 的惯用版本声明文件
mise settings add idiomatic_version_file_enable_tools "node,pnpm"

如果希望 mise 和 uv 配合体验更好的话,那么可以添加一些设置。详细说明请参考:https://mise.jdx.dev/mise-cookbook/python.html#mise-uv

Terminal window
# 让 mise 自动激活 uv 创建的虚拟环境
mise settings add python.uv_venv_auto source