编程 mise v2026.10.15:24 小时冷却覆盖所有后端,pin 最新版会解析成 no versions found

2026-11-01 21:32:29

mise v2026.10.15:默认 24 小时冷却覆盖所有后端,pin 最新版会解析成 no versions found

项目地址:https://github.com/jdx/mise

这个版本把原本只作用于「能报发布日期」那批后端的 24 小时 minimum_release_age 冷却,扩展到了全部后端。对 CI 里习惯 pin 最新版的人来说,这是最直接的破坏点:某个工具当前唯一的版本发布不到 24 小时,解析结果就是 no versions found。

冷却扩到所有后端

之前内置的 24h 冷却只覆盖 aqua、cargo、core、github、npm、pypi 等会上报发布日期的后端;asdf、vfox、conda、dotnet、http:、s3: 完全没有 cutoff。现在每个后端都受冷却约束,行为与 aqua、github 工具保持一致。

三种处理方式:

  • 单个工具豁免:把它加进 minimum_release_age_excludes。
  • 整体关闭:minimum_release_age = "0s"。
  • 只影响列表来源的选择(见下一节):MISE_USE_VERSIONS_HOST=0。

同时,配套日期上报的后端变多了,冷却才真正「拦得住」新版本:

  • conda 取 channel 的最早 index 时间戳。
  • aqua 中从 git tag 取版本的包(version_source: github_tag,如 aws/aws-cli、docker/cli、cockroachdb/cockroach)现在有日期。
  • dotnet 用 Microsoft 的 releases index;deno、erlang 用各自的 GitHub releases。
  • 每个 python 版本都有日期;更多 ruby 版本有日期(ruby-lang.org、JRuby 用 Maven Central、TruffleRuby 用 GitHub);Rust 的 stable / beta / nightly channel 也有日期。显式指定过去的 cutoff 时,rust@stable 会解析到「足够旧的最新 stable」,beta/nightly 解析到 cutoff 之前的带日期构建。
  • dart、flutter、nim、julia、nomad-pack、sentinel、tfc-agent、android-cli、cursor-agent、twg 这些 registry 工具开始上报日期。

拿不到发布日期的版本会打警告

日期未知的版本仍然放行,但 mise install、mise upgrade、mise use 会打印一次点名该版本的警告:

WARN asdf:tiny@3.1.0 has no release date, so the ... cutoff cannot be checked and it is allowed (exclude it with minimum_release_age_excludes to silence this)

自己写死的精确 pin 不触发;mise env、mise ls、mise outdated、mise ls-remote 从不打印。

版本列表默认走 mise-versions 主机

npm:、pipx:、cargo:、gem:、go:、dotnet:、spm: 以及带 version_list_url 的 http/s3 工具,现在和其他 registry 工具一样从 mise-versions 主机列版本,不再直接访问各自源。

有源重定向时仍直连源,覆盖场景包括:自定义 npm registry 或 npm.shell_out、pypi.registry_url、非默认 GOPROXY、cargo.registry_name、自定义 gem source、dotnet.registry_url、S3 endpoint 覆盖,以及本地 listing 选项。conda 始终从自己的 channel 列。

主机缓存的 TTL 现在跟随工具的 minimum_release_age。要让所有工具都回源列版本,设 MISE_USE_VERSIONS_HOST=0。

模板函数读结构化文件

read_json()、read_yaml()、read_toml() 解析文件后供模板取值,省掉把 package.json 或 Pulumi.yaml 里的版本手抄进 mise.toml:

[tools]
node = "{{ read_json(path='package.json')['volta']['node'] }}"
pulumi = "{{ read_yaml(path='Pulumi.yaml')['requiredPulumiVersion'] }}"

相对路径按配置文件所在目录解析。缺 key 会报错,除非加 | default(value="...")。和 read_file() 一样,这些函数要求配置是 trusted config,在 safe mode、.miserc.toml、OCI dotfile 模板中不可用。

dotnet@lts 与 dotnet@sts

dotnet@lts、dotnet@sts 按 Microsoft 的 release index 解析到当前 LTS 或 STS channel 里的最新 SDK,跳过 preview、go-live 和已 EOL 的 channel。你在 [tool_alias.dotnet.versions] 里定义的 lts 别名仍然优先。只装 runtime 的场景仍需精确版本号。

Windows 的 PowerShell 安装器

每个 release 会发布 install.ps1,并由 mise.run 的 /powershell 和 /pwsh 提供:

irm https://mise.run/pwsh | iex

支持 PowerShell 5.1+,不需要管理员权限。默认安装「至少 24 小时前」的最新 release,设置了 MISE_VERSION 则装指定版本;下载内容用 GitHub Releases 的 SHASUMS256.txt 校验。mise.exe 和 mise-shim.exe 落到 ~\.local\bin,该目录会被加进用户 Path。重复执行即为升级。可用选项:MISE_INSTALL_PATH、MISE_INSTALL_MODIFY_PATH=0、MISE_INSTALL_SHIMS_PATH=1、MISE_INSTALL_FROM_GITHUB=1。

dotfiles:真实符号链接与剪枝

dotfiles.windows_symlinks 默认 false。开启后 symlink 和 symlink-each 在 Windows 上创建真实文件符号链接;创建失败时 apply 直接报错,而不是静默退化成复制。前提是 Windows 开发者模式或提权 shell。把该设置重新关掉后,对仍持有链接的条目执行 mise dot unapply 需要加 --force。

[settings.dotfiles]
windows_symlinks = true

mise bootstrap --prune-dotfiles 会删除已不再部署的 dotfiles,等价于 mise dot apply --prune,所以 mise bootstrap --upgrade --prune-dotfiles 一次跑完。剪枝发生在 dotfiles 阶段末尾,遵守 --dry-run、--yes 和 --skip dotfiles;你手动改过的副本会保留。

其他新增

  • http: 工具可用 version_date_expr 从 version_list_url 的响应里映射发布日期;version_date_url 换一个 URL 读日期,version_date_next_expr 跟进分页列表(仅同 host)。日期支持 RFC 3339、YYYY-MM-DD 和 HTTP date。
  • vfox 插件的 Available 或 BackendListVersions hook 可为每个版本返回 created_at(RFC 3339),纯版本字符串仍然可用。
  • mise tasks -a 是 mise tasks --all 的短别名。

修复

  • mise fmt 不再破坏多行内联表(TOML 1.1):以前会把注释从表里拽出来、丢掉缩进,现在原样保留。
  • 某个任务的 dir 模板渲染失败时,其他任务的命令仍可执行;此前所有命令都会失败,包括 mise tasks validate。现在 mise tasks validate 把出错任务标记为 invalid-directory-template,只有运行该任务才失败。
  • aqua 工具能在 macOS universal 归档里找到二进制(如 fastfetch 2.70.0)。
  • npm: 中由 allow_builds 批准的 lifecycle script,在 ~/.npmrc 设了 ignore-scripts=true 时也会执行。
  • mise lock 在 aube 配置指定了其他默认 lockfile(如 pnpm-lock.yaml)时不再失败。
  • mise 数据目录路径含 .. 时(例如本地化环境),.7z 归档可正常解压。
  • Windows release 里的 mise-shim.exe 保留版本标签,mise doctor 和 mise reshim --force 不再报它过期;更新后执行一次 mise reshim --force 即可消除警告。
  • Windows 上 symlink-each 的提示和 dry-run 预览改为「已复制」,不再说成符号链接。
  • 配置了 RUSTUP_DIST_SERVER 镜像且 GitHub 不可达时,mise 能列出 stable/beta/nightly channel,rust@stable 可走镜像安装。
  • Windows 上 http: 安装大归档时,杀毒软件扫描解压文件导致的 "Access is denied" 不再直接失败,最终移动最多重试约一分钟。

文档侧新增了 mise.toml playground(带 schema 的编辑器,支持 hover 帮助、补全和错误检查,配置可分享链接);mise.toml 参考改成按主题分组的可搜索键浏览器,几乎所有键都有描述,也会出现在 mise config explain 里。

复制全文 生成海报 mise 开发工具 版本管理 CI dotfiles Go

推荐文章

程序员茄子在线接单