Mise
Mise 是个用来管理工具链版本和切换环境的工具,也可以充当任务运行器。
作为工具链管理器,Mise 可以替代许多工具,比如 nvm、pyenv 等。这些程序通常只用来管理一个工具的版本,而 Mise 可以管理多种工具的版本。你可以在 Mise Registry 上查看 Mise 能够管理的所有工具。如果你正在使用多个不同工具的版本管理器,那么 Mise 可能非常适合你,它让你不再需要记忆每种工具的用法,只需知道 Mise 怎么用就行了。
作为环境切换工具,Mise 是 direnv 的替代品。功能很简单,就是修改 环境变量 而已。对于部分工具,比如 Python,Mise 还能在进入目录时自动激活虚拟环境。
作为任务运行器,Mise 通过 toml 定义任务,语法和 Make、Just 差异很大。作为写习惯了 Make 的人,我还是更喜欢 Just,它改善了 Make 且语法类似。不过,大多数时候使用 Mise 也很方便。
# Windowsscoop install mise环境变量 MISE_DATA_DIR 决定了 Mise 的数据保存在哪里。
Mise 的一些功能需要与 Shell 集成(官方说法是激活)后才能使用。你可以阅读 官方文档 了解如何激活 Mise
# pwsh(&mise activate pwsh) | Out-String | Invoke-Expression# basheval "$(mise activate bash)"# zsheval "$(mise activate zsh)"在上述激活方式中,Mise 通过修改 PATH 切换运行时版本。Mise 还有另一种切换运行时版本的方式,就是修改 Shims,它和修改 PATH 的方法略有不同,详细的比对可参考 官方文档。
PATH 更适合交互式 Shell 环境,而 Shims 推荐用于非交互式环境。同时使用二者也没有问题。使用 Shims 的方式就是在把 $MISE_DATA_DIR/shims 目录添加到 PATH 中。
Mise 可以用来管理多种编程语言运行时的不同版本,也可以用来管理本地开发工具的不同版本。
Mise 会自动更新 PATH 或 Shims 以确保你使用了正确的版本,不过该功能需要激活。
Mise 可以更改全局使用的运行时版本
# 全局使用 python latestmise use -g python# 全局使用 nodejs ltsmise use -g node@lts# 全局使用 java 17mise use -g java@17这会修改 ~/.config/mise/config.toml 文件,添加类似这样的内容
[tools]java = "17"node = "lts"python = "latest"也可以更改当前项目使用的运行时版本
# 当前项目使用 nodejs 20mise use node@20这会在当前目录下创建 mise.toml 文件,并添加如下内容
[tools]node = "20"如果激活了 Mise,则只要处于这个项目中,Mise 就会自动使用这个运行时的版本。
有些需要全局使用的 CLI 工具不在系统包管理器中,必须通过其它包管理器获取,或手动去资源发布处下载并安装。此时可以使用 Mise 统一管理这些 CLI 工具,而不必记忆每种工具的安装方式。
不过 Mise 并不直接管理 CLI 工具,而是借助被称为后端的包管理器或生态系统。所有可用的后端可以在 官方文档 中查看。
我主要使用 Mise 管理 Python 和 NodeJS 生态的 CLI 工具。个人偏爱 Rust 写的工具,因此先用 Mise 安装相关的包管理器 uv 和 aube
# 安装 uvmise use -g uv# 安装 aubemise use -g aube这会在文件 ~/.config/mise/config.toml 中添加如下内容
[tools]aube = "latest"uv = "latest"然后在 ~/.config/mise/config.toml 中更改配置,以替代 pipx 和 npm 后端的默认工具
[settings.pipx]uvx = true
[settings.npm]package_manager = "aube"然后正常安装工具即可
mise use -g npm:@mermaid-js/mermaid-climise use -g pipx:argostranslate对于 pipx 后端,如果安装工具时存在额外依赖,那么要先在 ~/.config/mise/config.toml 中描述工具的安装需求
[tools]"pipx:markitdown" = { version = "latest", extras = "all" }然后再安装
mise use -g pipx:markitdownmise 会自动在当前 shell 会话中设置环境变量,这个功能同样需要激活。
# 进入当前项目后自动设置mise set NODE_ENV=production这会在 mise.toml 中添加如下内容
[env]NODE_ENV = "production"有一些环境变量比较特殊,比如 _.python.venv。若将其设置为虚拟环境的路径,mise 就会在进入项目目录后自动激活虚拟环境 不过这样似乎无法通过 deactivate 退出虚拟环境了
[env]_.python.venv = "venv" # 这是虚拟环境的相对路径你可以在 这里 找到更多的特殊环境变量
此外,也可以用 mise 管理全局环境变量。相比写入 ~/.bashrc / ~/.zshrc 等方案,mise 可以更好的跨 Shell 同步。
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 会显示所有的任务,以及对应的描述信息
更新后自动安装包
Section titled “更新后自动安装包”Mise 允许在语言运行时更新后,自动安装一些包。比如对于 NodeJS,可以在 ~/.default-npm-packages 中写入
lodashrequestexpress这种默认安装适合那些需要全局使用通用编程库,而非命令行工具。后者可能用 mise use -g npm:xxx 更好。
支持惯用版本声明文件
Section titled “支持惯用版本声明文件”如果希望 Mise 能够支持 .nvmrc、.python-version 等惯用的版本声明文件,需要添加一些设置。这样和别人协作时,如果项目里有这些文件,就不需要安装对应的工具,也不需要在项目里添加 mise.toml,实现无感的工具替换。
# 让 mise 能够支持 python 的惯用版本声明文件mise settings add idiomatic_version_file_enable_tools python# 让 mise 能够支持 node / pnpm 的惯用版本声明文件mise settings add idiomatic_version_file_enable_tools "node,pnpm"对特定工具的配置
Section titled “对特定工具的配置”如果希望 mise 和 uv 配合体验更好的话,那么可以添加一些设置。详细说明请参考:https://mise.jdx.dev/mise-cookbook/python.html#mise-uv
# 让 mise 自动激活 uv 创建的虚拟环境mise settings add python.uv_venv_auto source