告别环境混乱!使用 mise 管理你的开发环境

告别环境混乱!使用 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

除此之外,还有 cargovfoxaquanpmgithubpipx 等 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,毕竟功能更加强大。

相关推荐
传说之后2 小时前
以Hadoop为例,解读分布式计算设计
后端·架构
枫叶V2 小时前
Scrapling 入门:一个现代 Python 网页采集框架
后端·爬虫
alwaysrun2 小时前
C++之高性能跨平台日志库spdlog
c++·后端·编程语言
小小荧2 小时前
Vue Native多分支迭代,Vue跨端原生生态迎来革新
前端·javascript·vue.js
EntyIU2 小时前
uv工程化项目指南
前端·python·uv
Gopher_HBo2 小时前
Go语言加密算法
后端
青云计划2 小时前
数据库的守护者-单飞锁
后端
神奇小汤圆2 小时前
每次重启能救下几十万个请求:Cloudflare 如何用 Rust 实现零停机升级
后端
用户298698530142 小时前
Java 统计 Word 文档中的单词数量
java·后端