Course Builder个人学习工作台 · 本地模式
mise 实战:从工具版本到可复现 CI

M006:锁住解析结果:mise.lock、平台与 strict mode

目标:从版本选择器生成可审阅的解析记录,并用严格安装验证 lockfile 的覆盖边界。

0–7 分钟:配置表达意图,lockfile 记录结果

node = "22" 的含义是“选择符合 22 的版本”,不是“永远使用某个补丁版本”。mise.lock 可以记录具体解析版本;backend 支持时,还会记录按平台区分的 URL、checksum、size 或 provenance。[S06]

把两者分工写成一句话:

mise.toml 适合人审阅“想要什么”;mise.lock 适合机器复用“上次解析成什么”。

lockfile 也有边界:不同 backend 能记录和验证的信息不同。缺少 checksum 时,应写“此 backend 只提供版本或部分工件信息”,而不是宣称供应链已被完整验证。[S06]

7–19 分钟:生成、阅读并验证 lockfile

继续使用 M005 的 /tmp/mise-task-lab。

步骤 1:确认配置仍是模糊选择器

cd /tmp/mise-task-lab
grep -A3 '^\[tools\]' mise.toml
mise exec -- python --version

记录选择器 3.12 与实际输出的具体版本。两者不同层级是正常的。

步骤 2:显式生成 lockfile

mise lock
ls -l mise.lock

如果当前 CLI 报参数变化,先运行 mise lock --help,按本机版本的官方帮助调整;不要手写一个看起来合理的 lockfile。

步骤 3:按字段审阅,而不是只确认文件存在

cat mise.lock

至少查找并记录:

  1. 工具名与原始 specifier;
  2. resolved version;
  3. backend;
  4. 当前或目标平台键;
  5. URL、checksum、size、provenance 中实际存在的字段。

用表格写结论:

工具specifierresolvedbackend平台可验证字段缺口
python3.12以文件为准以文件为准以文件为准以文件为准不存在的字段如实写

步骤 4:运行 locked install

mise install --locked
printf 'exit=%s\n' "$?"

预期观察:当前已锁定且 backend 支持的工具成功安装,退出码为 0。locked 模式的价值不是让命令看起来更严格,而是在缺少所需 lock 信息时尽早失败。[S06]

19–25 分钟:用负向测试证明 strict 真的在工作

步骤 1:备份配置和 lockfile

cp mise.toml /tmp/mise-task-lab.toml.good
cp mise.lock /tmp/mise-task-lab.lock.good

步骤 2:添加一个未进入 lockfile 的声明

cat >> mise.toml <<'EOF'

[tools.ripgrep]
version = "14"
EOF

不要运行 mise lock,直接执行:

mise install --locked
status=$?
printf 'locked_exit=%s\n' "$status"

预期观察:对 strict 能覆盖的 backend,命令因新声明没有相应 lock 信息而非零失败。若它仍成功,不要硬写“测试通过”:检查当前 mise 版本、配置语法和 backend 支持表。官方文档说明有些 backend 无法报告 URL,strict 检查会跳过这些能力不足的 backend;这本身就是需要记录的覆盖缺口。[S06]

步骤 3:恢复,再走正确更新路径

mv /tmp/mise-task-lab.toml.good mise.toml
mv /tmp/mise-task-lab.lock.good mise.lock
mise install --locked

真实升级时应修改配置或运行受审阅的 bump 命令,再由 mise lock 重新生成并审阅 diff;不要手改 resolved version 或 checksum 来“修绿”。

25–28 分钟:处理跨平台与 task tools

本机生成成功不自动证明 Linux CI 可用。按目标矩阵检查:

  1. 写出项目实际支持的平台,例如 macos-arm64 与 linux-x64。
  2. 在 mise.lock 中检查每个 lockable 工具是否有对应平台信息。
  3. 缺少平台时,使用当前 mise lock --help 支持的平台参数生成,再审阅新增 URL/checksum。
  4. 检查 task 是否声明了 task-specific tools;官方 lock 命令也会读取 task 定义并锁定这些工具。[S06]
  5. 在 CI 目标平台运行 locked install,不能用本机文件检查替代实际验证。[S09]

Worked review

看到下面情况时:

node: linux-x64 有 URL + checksum
python: 只有 resolved version

正确结论不是“两个工具都完整锁定”,而是:版本解析都被记录;Node 的 Linux 工件可按 lock 信息验证;Python 当前 backend 的工件校验信息不足,需要按 backend 能力和 CI 风险补充控制。

常见失败与下一步:

  • mise.lock 没生成:检查 lockfile 设置和 mise lock --help,显式运行生成命令。
  • diff 突然升级多个工具:停止合并,核对选择器、缓存和 bump 范围;一次更新应能解释每个变化。
  • macOS 成功、Linux strict 失败:查看 Linux 平台条目是否缺 URL/checksum,而不是关闭 strict。
  • checksum 变化但版本没变:视为需要调查的供应链变化,不能自动当作无害格式更新。

28–30 分钟:检索问题

问题:为什么有 mise.lock 仍不代表所有供应链风险已解决?

作答后查看参考答案

backend 对版本、URL、checksum 和 provenance 的支持不一致;lockfile 也不处理发布者账号安全、工具内部依赖链、项目配置代码执行、secret 管理或运行时隔离。

通过标准

  • 能从选择器追溯到 resolved version、backend 和平台信息。
  • locked install 有一次成功和一次可解释的负向测试。
  • backend 跳过的校验能力被记录为限制,而不是伪装成通过。
  • 更新与跨平台策略说明谁更新、审什么、在哪里验证、怎样回滚。

Sources used

  • S06 jdx/mise, mise.lock Lockfile.
  • S09 jdx/mise, Continuous integration.