跳转到内容

多运行时版本管理器 mise

mise(发音同 “mice”)是一款用 Rust 编写的高性能多运行时版本管理器,它能够帮助开发者在单个工具中统一管理多种编程语言和工具的版本。

  • 多语言统一管理:支持 Node.js、Python、Ruby、Go、Java、Rust 等多种语言和工具的版本管理
  • 高性能:基于 Rust 开发,执行速度快,启动时间短
  • 统一接口:使用一致的命令行界面管理所有语言版本,无需学习多种工具
  • 项目级配置:通过配置文件在团队中共享工具版本,确保开发环境一致性
  • 兼容性:兼容 asdf 插件系统,支持多种版本文件格式(如 .nvmrc、.python-version)
  • 任务管理:内置任务系统,可以替代 npm 或 make 等工具
  • 当你需要在不同项目间切换使用不同版本的编程语言
  • 当你同时开发多种语言的项目(如前端+后端全栈开发)
  • 当团队协作需要统一开发工具版本
  • 在 CI/CD 流程中确保构建环境的一致性

在 macOS、Linux 或 WSL 环境中,可以使用以下命令安装最新版本的 mise:

Terminal window
# 安装最新版本
curl https://mise.run | sh
# 安装特定版本
curl https://mise.run | MISE_VERSION=v2024_5_16 sh
  • Homebrew(macOS):

    Terminal window
    brew install mise
  • Windows

    Terminal window
    # 使用 Scoop 安装
    scoop install mise
    # 或使用 Chocolatey
    choco install mise

安装完成后,需要将 mise 集成到你的 shell 中:

Terminal window
echo 'eval "$(mise activate bash)"' >> ~/.bashrc
source ~/.bashrc
Terminal window
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
source ~/.zshrc
mise activate fish | source
# 或者永久启用
mise activate fish >> ~/.config/fish/config.fish
source ~/.config/fish/config.fish

安装完成后,可以通过以下命令验证:

Terminal window
mise --version
Terminal window
# 安装并设置 Node.js 全局默认版本
mise use --global node@20.0.0
# 验证版本
node -v
Terminal window
# 进入项目目录
cd my-project
# 设置项目使用的 Node.js 版本
mise use node@18.16.0
# 现在在该目录下运行的 Node 就是 18.16.0 版本
node -v

当你进入一个包含 .mise.toml 或其他版本文件的项目时,可以自动安装缺失的工具:

Terminal window
# 安装项目所需的所有工具
mise install
Terminal window
# 列出可用的 Node.js 版本
mise ls-remote node
# 列出已安装的 Node.js 版本
mise ls node

在当前会话中临时使用特定版本:

Terminal window
# 在当前会话中使用 Node.js 16
mise shell node@16

在项目根目录创建 .mise.toml 文件,可以指定项目使用的工具版本和环境变量:

# 工具版本定义
[tools]
node = '18'
python = '3.11'
ruby = '3.2'
# 环境变量设置
[env]
NODE_ENV = 'development'
DEBUG = 'app:*'
# 任务定义
[tasks]
build = "npm run build"
test = "npm test"
start = "npm start"

mise 可以识别多种版本文件格式,包括:

  • .mise.toml:mise 专用配置文件
  • .tool-versions:兼容 asdf 的版本文件
  • .node-version:Node.js 版本文件
  • .nvmrc:nvm 版本文件
  • .python-version:Python 版本文件
  • .ruby-version:Ruby 版本文件

mise 的核心功能是管理多种编程语言和工具的版本。它通过插件系统支持各种语言,可以轻松安装、切换和管理不同版本。

Terminal window
# 安装特定版本的 Python
mise install python@3.10
# 切换到已安装的版本
mise use python@3.10
# 卸载不需要的版本
mise uninstall python@3.9

mise 可以为不同项目设置不同的环境变量,避免全局环境变量冲突:

.mise.toml
[env]
# 为项目设置环境变量
DATABASE_URL = 'postgres://localhost:5432/myapp'
API_KEY = 'dev-key-123'
# 基于条件设置环境变量
[env.production]
NODE_ENV = 'production'
DATABASE_URL = 'postgres://production.example.com:5432/myapp'

使用环境变量:

Terminal window
# 激活环境变量
mise activate
# 运行命令时使用特定环境
mise run production -- node app.js

mise 内置任务系统,可以替代 npm scripts 或 makefile,提供跨语言的任务管理:

.mise.toml
[tasks]
# 基本任务定义
build = "npm run build"
# 带描述的任务
lint.description = "Run code linter"
lint = "eslint . --ext .js,.jsx,.ts,.tsx"
# 依赖其他任务的任务
test.depends_on = ["lint", "build"]
test = "jest"
# 带参数的任务
serve.description = "Start development server"
serve = "npm run dev -- {{args}}"

运行任务:

Terminal window
# 运行基本任务
mise run build
# 运行带参数的任务
mise run serve -- --port 3000
# 列出所有可用任务
mise tasks

mise 兼容 asdf 的插件系统,可以使用现有的 asdf 插件,也可以创建自定义插件:

Terminal window
# 安装插件
mise plugins install node
# 列出已安装的插件
mise plugins
# 更新插件
mise plugins update node
# 移除插件
mise plugins remove node
特性misenvm
语言支持多语言(Node.js、Python、Ruby 等)仅 Node.js
性能基于 Rust,启动快基于 Shell,启动较慢
跨平台支持 macOS、Linux、Windows主要支持 Unix 系统,Windows 需要 nvm-windows
配置文件支持多种格式仅支持 .nvmrc
任务管理内置任务系统
特性miseasdf
性能更快(基于 Rust)较慢(基于 Shell)
插件兼容性兼容 asdf 插件原生支持
配置文件支持 .mise.toml 和 .tool-versions主要使用 .tool-versions
环境变量内置环境变量管理需要 asdf-direnv 插件
任务管理内置任务系统
特性misefnm
语言支持多语言仅 Node.js
性能同样基于 Rust,性能接近基于 Rust,性能优秀
配置文件支持多种格式支持 .nvmrc 和 .node-version
跨平台全平台支持全平台支持

可以为常用的版本创建别名,便于记忆和使用:

.mise.toml
[alias]
# 将 Node.js 20 设为 "stable"
stable = "node@20"
# 将 Python 3.11 设为 "latest"
latest = "python@3.11"

使用别名:

Terminal window
mise use stable

mise 提供命令行自动完成功能,可以通过以下命令设置:

Terminal window
# 为 Bash 设置自动完成
eval "$(mise completion bash)" >> ~/.bashrc
# 为 Zsh 设置自动完成
eval "$(mise completion zsh)" >> ~/.zshrc
# 为 Fish 设置自动完成
mise completion fish > ~/.config/fish/completions/mise.fish

mise 支持钩子机制,可以在特定事件发生时执行自定义脚本:

Terminal window
# 创建安装后钩子脚本
mkdir -p ~/.config/mise/hooks/post-install
echo '#!/bin/sh
# 安装后自动安装 npm 包管理器
if [ "$TOOL" = "node" ]; then
npm install -g npm
fi' > ~/.config/mise/hooks/post-install/node
# 设置脚本可执行权限
chmod +x ~/.config/mise/hooks/post-install/node

在 CI/CD 流程中使用 mise 确保构建环境一致性:

# GitHub Actions 示例
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install mise
run: curl https://mise.run | sh
- name: Install tools
run: ~/.local/bin/mise install
- name: Run build
run: ~/.local/bin/mise run build
  • 在项目根目录创建 .mise.toml 文件,指定项目所需的所有工具版本
  • .mise.toml 文件添加到版本控制系统中,确保团队成员使用相同的工具版本
  • 同时保留特定语言的版本文件(如 .nvmrc),以便与不使用 mise 的团队成员兼容
# 推荐的项目配置示例
[tools]
node = '18.16.0'
python = '3.11.4'
ruby = '3.2.2'
[env]
# 项目特定的环境变量
NODE_ENV = 'development'
DEBUG = 'app:*'
[tasks]
# 标准化的项目脚本
setup = ["npm install", "pip install -r requirements.txt"]
build = "npm run build"
test = "npm test"
serve = "npm run dev"
  • 为团队制定统一的 mise 使用规范
  • 在项目文档中说明如何使用 mise 设置开发环境
  • 使用全局配置设置常用的工具版本和别名
# ~/.config/mise/config.toml - 全局配置示例
[alias]
# 团队标准版本别名
team-node = "node@18"
team-python = "python@3.11"
[tools]
# 全局默认工具版本
node = 'team-node'
python = 'team-python'
  • 避免安装过多不必要的工具版本,定期清理不再使用的版本
  • 使用 mise shell 命令临时切换版本,而不是频繁修改全局设置
  • 利用 mise 的自动激活功能,但注意不要在过于复杂的环境中过度使用
Terminal window
# 清理未使用的版本
mise prune
# 检查安装的所有工具占用的空间
mise doctor

当遇到问题时,可以使用以下命令进行排查:

Terminal window
# 检查 mise 配置和环境
mise doctor
# 查看详细日志
mise --log-level debug install node
# 重置 mise 环境
mise reset

mise 作为一款现代的多运行时版本管理器,以其高性能、多语言支持和统一接口等特性,为开发者提供了高效的开发环境管理解决方案。无论是个人开发还是团队协作,mise 都能帮助简化环境配置,提高开发效率。

与传统的单一语言版本管理器相比,mise 的优势在于能够在一个工具中统一管理所有开发语言和工具,避免了安装和学习多个工具的麻烦。同时,它的高性能和丰富功能也使其成为多语言开发环境的理想选择。

如果你是一个需要同时处理多个语言项目的开发者,或者正在寻找一个能够统一管理开发环境的工具,不妨尝试一下 mise,相信它会给你的开发工作带来很大的便利。