使用 mise 替代 asdf 管理开发工具的版本

发表于 更新于

前言

一直以来我都使用 asdf 管理开发环境各工具链的版本,它可以让每一个项目都允许拥有自己的一套版本,不会因为依赖全局性的东西导致额外的负担(例如系统中的工具版本变更导致和项目不兼容)。

在最近我接触到 mise,并最终决定用它取代 asdf。倒不是因为 asdf 不好,是因为 mise 更好。

用途

这是一个额外章节,我有必要提前讲述一下为什么要使用 asdfmise。你完全可以不同意这些观点。

使用 asdf 有以下几个理由:

  1. 你的项目进展不一,对应的开发环境版本不一致。例如 A 项目最近还在维护,它有可能升级到最新的工具版本(如 Java 18)。但 B 项目是 10 年前的,它最多基于当时的 Java 8。
  2. 你总是想使用自己的版本,摆脱系统软件源。例如各 Linux 发行版的软件源会根据自己的计划来维护软件包的版本,他们的频率和你可能并不一致。例如他们决定半年后升级到最新的 Java 大版本,但你现在就想用(或不想升级)。摆脱 Linux 发行版软件源中的开发工具,是将 Linux 作为开发环境时非常基本的前提。

有时候这些理由不适用你的场合。例如你使用的开发工具非常成熟,发展已渐缓。几年可能都不会有什么明显动静。这种情况下,确实是不重要了。就像我们编译大量 C/C++ 开源软件时甚至可以用各种版本跨度的编译器。

如果你使用的是一些更激进的开发语言,它们的版本发布非常快,经常推陈出新(淘汰各种旧 API)。那就有很大的必要性了。

相同点

mise 可以无缝替代 asdf,因为它具有 asdf 的一切功能。实际上 mise 默认把 asdf 作为后端,可以直接使用 asdf 的所有插件生态。

命令行使用

asdf 中,我们通过命令添加插件,然后安装插件对应工具的各种版本:

asdf plugin-add elixir # 添加 Elixir 插件
asdf install elixir 1.16.2-otp-26 # 安装指定的 Elixir 版本

上述过程在 mise 中是一个操作:

mise use elixir@1.16.2-otp-26

mise 会自动完成 Elixir 的插件和版本安装。

配置文件使用

asdf 中,会默认加载当前目录下的 .tool-versions 文件。这是一种十分简洁的 K/V 文本,如下:

erlang 26.2.5
elixir 1.16.2-otp-26

mise 中则使用了更为复杂 toml 格式,命名为 .mise.toml。如下:

[tools]
erlang = "26.2.5"
elixir = "1.16.2-otp-26"

上述两个文件定义的配置是完全等同的。mise 会像 asdf 自动加载 .tool-versions 文件那样,默认加载 .mise.toml 文件。

优势

mise 除了完全兼容 asdf 以外,还进行了一些扩展,功能和使用体验增强。

兼容旧配置

mise 兼容 .tool-versions 文件,并且也会默认加载它。所以切换到 mise 以后甚至可以不用改动什么,是一种无缝无感的过渡。若需要 .tool-versions 无法实现的功能,则可以开始用 .mise.toml 取代。

更为自动化

使用 asdf 时若 .tool-versions 中的版本并未安装,调用这些工具会得错误提示。然后由用户手动执行 asdf install 才能正常使用。

mise 在这方面提高了使用体验:当发现配置的版本未安装,会自动执行安装过程,然后再执行用户的原始命令。

传递选项

mise 可以通过 .mise.toml 配置向工具传递的选项。例如给 Python 传递虚拟环境的目录:

[tools]
python = {version='3.10', virtualenv='.venv'}

这样我们就不需要每次都用命令手动激活。

作为包管理器

mise 不仅仅可以安装各语言的基础工具链,甚至还可以管理某些语言的依赖包的版本。例如著名的十分全能的格式化工具 prettier,它是使用 JS 实现的 NodeJS 运行时的软件包,通常需要 NPM 来管理。

但我们可以这样配置:

[tools]
"npm:prettier" = "latest"

mise 来管理 prettier 的安装和版本,然后直接在命令行使用它。一般来讲我们在 package.json 中添加依赖来安装它,然后添加 scripts 来调用。但 mise 更适用于在没有 Web 前端的项目上使用这些 NPM 软件包。

当然不仅仅是管理 NPM 包,它还有其它支持的后端

更多功能

mise 可以在配置中预定义环境变量,自定义插件的 URL(仓库)。自身还提供了大量可配置的定制选项。更多可以参考官方文档

细心的你可能会发现 mise 这一个工具可以同时替代好几个工具。

结束语

mise 是一个用 Rust 实现的工具,不难看出在设计上也借鉴了 Rust 自身的一些使用逻辑。例如和 Cargo 同样的配置格式,能自动化执行就不去指导用户手动执行。

asdfmise 不仅没有切换成本还能带来更高的便利性。总的来说,十分推荐。

本文由作者按照 CC BY 4.0 进行授权
分享:

相关文章