M002:声明工具:use、install、exec 与版本来源
目标:为项目声明两个工具,并用配置、解析版本与二进制路径三类证据证明结果。
0–6 分钟:把四件事分开
工具管理最容易混淆的是“写了版本”“解析了版本”“安装了文件”和“命令正在使用它”。把它们放成一条链:
版本意图写进配置 → backend 解析具体版本 → 工具安装到本机 → 命令在 mise 上下文执行
mise use node@22:选择版本意图,安装工具,并更新当前项目配置。mise install:按已经加载的配置安装工具;它不会替项目凭空选择一个新版本意图。mise exec -- node -v:用有效配置提供的 Node 执行一次命令。mise which node:回答“mise 当前会使用哪个二进制”。[S02]
因此,缓存里“已经有 Node 22”和仓库“声明使用 Node 22”不是同一件事。前者是机器状态,后者才是团队可以审阅的项目意图。
6–19 分钟:从空仓库建立双工具配置
步骤 1:创建实验仓库并确认起点
rm -rf /tmp/mise-tools-lab
mkdir -p /tmp/mise-tools-lab
cd /tmp/mise-tools-lab
git init
ls -la
预期观察:除 .git 外没有 mise.toml。如果 mise config 仍显示父目录配置,说明 /tmp 上层存在可发现配置;换一个真正隔离的路径,或把继承来源明确记下。
步骤 2:声明两个版本意图
mise use python@3.12
mise use node@22
然后检查文件:
cat mise.toml
预期能看到与下面等价的声明,格式顺序可能不同:
[tools]
python = "3.12"
node = "22"
3.12 与 22 是版本选择器,不是最终解析版本。它们允许同一大/小版本中的更新;M006 才会用 lockfile 记录解析结果。[S01][S02]
步骤 3:按配置安装,而不是再次选择
mise install
这一步用于验证配置足够让另一台机器安装。若工具已在缓存中,命令可能很快完成;“没有下载”不等于“没有执行”。
步骤 4:收集三层证据
printf '\n== config ==\n'
cat mise.toml
printf '\n== resolved versions ==\n'
mise exec -- python --version
mise exec -- node --version
printf '\n== binary paths ==\n'
mise which python
mise which node
把输出按三列理解:
| 证据 | 回答的问题 | 不能证明什么 |
|---|---|---|
mise.toml | 仓库声明了什么版本意图 | 当前具体解析到了哪个补丁版本 |
--version | 当前执行出的具体版本 | 二进制一定来自 mise |
mise which | mise 选择的实际路径 | 新机器已能从空缓存安装 |
只有把三者放在一起,结论才不容易被系统 PATH 或本机缓存误导。
19–25 分钟:读懂 backend 与配置来源
backend 是 mise 获取和安装工具的实现来源,例如 core、aqua、github、npm 或 pipx。你不需要背 registry,但需要知道“同一个工具名通过哪个 backend 解析”,因为安装方式、lockfile 信息和校验能力可能不同。[S02]
按下面步骤检查:
- 运行
mise ls --current,观察工具名、请求版本与解析版本。 - 运行
mise config,确认当前加载了哪些配置文件。 - 查看
mise --help或相应子命令--help,找出当前版本用于显示 backend 的列或详细选项。 - 为 Python 和 Node 各写一行:
工具 → 配置来源 → 版本选择器 → 解析版本 → backend/安装来源 → 二进制路径。
示例(不要照抄版本号):
node → /tmp/mise-tools-lab/mise.toml → 22 → 22.x.y → core:node → ~/.local/share/mise/installs/...
常见失败与下一步:
cat mise.toml没有某个工具:检查mise use是否在错误目录执行,以及是否使用了--global。node -v与mise exec -- node -v不同:这是预期的诊断信号;前者取决于 shell PATH,后者取决于 mise 上下文。mise which找不到工具:先运行mise install,再用mise config确认声明确实被加载。- 解析版本与同事不同:版本选择器允许更新,先不要手写假精确版本;记录差异,留到 lockfile 课解决。
25–30 分钟:迁移与检索
假设同事发来这段说明:
我运行过 mise install node@22,所以项目已经固定 Node 22。
逐步纠正:
mise install node@22可以把某个版本安装到本机,但“本机已安装”不等于“项目已声明”。- 检查仓库
mise.toml是否有node = "22";没有就不能从仓库恢复选择。 - 用
mise use node@22或审阅后直接修改配置,才把意图持久化。 - 即使已声明
22,它仍是选择器;精确解析结果需要 lockfile。
问题:mise use 与无参数 mise install 的最重要差异是什么?
作答后查看参考答案
mise use 选择并写入版本意图,同时安装工具;无参数 mise install 按当前已加载配置安装,不替项目选择一个新的版本意图。
通过标准
mise.toml同时声明两个工具,且没有误用--global。- 能分别指出版本选择器、解析版本和二进制路径。
- 能解释 backend 为什么影响安装与后续 lockfile 能力。
- 在未 activation 的新 shell 中,
mise exec --仍能使用项目选择。