mise v2026.10.25(Published 2026-10-31T10:24:21Z,约北京时间 10 月 31 日 18:24)给任务加了 CLI 侧编辑:mise tasks set / mise tasks rm,以及增强后的 mise tasks add;同版本还上了 mise watch --once。本机从 2026.10.24 linux-x64 (2026-10-30) 升到 2026.10.25 linux-x64 (2026-10-31) 后,在一个最小 Spring Boot 3.4.5 项目里用 tasks set 改了 test 的 description,再用 mise watch test --once:启动时不跑,改 Java 测试源后只跑一轮,退出码和 Surefire 结果对齐。
官方 Release 标题就是这两件事:Edit and remove tasks from the CLI, and mise watch --once。口径上也写明,适合脚本和 coding agent。set 只改你传入的字段,其余 TOML(含注释)原样保留;rm 没有终端确认时需要 --yes;三者都带 --json / --dry-run,以及与 mise use 同风格的 --env / --global / --path。和 2026.10.24 容器 daemon、2026.10.19 默认 generate 锁文件 一样,先把二进制踩准再谈行为。
升级仍可能撞上 self-update 的「最低发布年龄 24h」。这次直接装官方 linux-x64 包:
curl -fsSL -o mise.tar.gz \
https://github.com/jdx/mise/releases/download/v2026.10.25/mise-v2026.10.25-linux-x64.tar.gz
tar -xzf mise.tar.gz
install -m 755 mise/bin/mise ~/.local/bin/mise
mise --version
# 2026.10.25 linux-x64 (2026-10-31)
mise watch 依赖 watchexec。本机用 mise use -g watchexec 落到 watchexec@2.8.0(官方要求 --exit-on-error 至少 2.5.0)。
演示项目是手写的最小 Spring Boot 3.4.5:pom.xml + DemoApplication + 一个断言 greetingLength("spring") == 12 的单元测试。根目录 mise.toml 一开始长这样:
[tools]
java = "21"
[tasks.test]
description = "Run Maven unit tests"
run = "mvn -q test"
sources = ["src/**/*.java", "pom.xml"]
[tasks.package]
description = "Package Spring Boot jar"
run = "mvn -q -DskipTests package"
depends = ["test"]
sources = ["src/**/*.java", "pom.xml"]
mise trust 之后 mise tasks ls 能看到 test / package。先把 description 改成更贴 Spring 的说法,并带上 dry-run:
$ mise tasks set test --dry-run \
--description "Spring Boot unit tests via Maven" -- mvn -q test
mise task test would be updated in /path/to/project/mise.toml
$ mise tasks set test --json \
--description "Spring Boot unit tests via Maven" -- mvn -q test
{
"task": "test",
"action": "updated",
"kind": "toml",
"path": "/path/to/project/mise.toml",
"table": {
"description": "Spring Boot unit tests via Maven",
"run": "mvn -q test",
"sources": [
"src/**/*.java",
"pom.xml"
]
},
"newly_trusted": false,
"dry_run": false
}
对应的 diff 只有一行 description(command 本来就是 mvn -q test,set 再写一遍也不会乱改):
@@ -2,7 +2,7 @@
java = "21"
[tasks.test]
-description = "Run Maven unit tests"
+description = "Spring Boot unit tests via Maven"
run = "mvn -q test"
sources = ["src/**/*.java", "pom.xml"]
增强后的 add 同样支持 --depends / --json / --dry-run。临时加一个依赖 test 的 check,再 rm --yes 清掉:
$ mise tasks add check --dry-run \
--description "Quick sanity echo after tests" --depends test -- echo ok
mise task check would be added to /path/to/project/mise.toml
$ mise tasks add check --json \
--description "Quick sanity echo after tests" --depends test -- echo ok
{
"task": "check",
"action": "added",
"kind": "toml",
"path": "/path/to/project/mise.toml",
"table": {
"depends": ["test"],
"description": "Quick sanity echo after tests",
"run": "echo ok"
},
"newly_trusted": false,
"dry_run": false
}
$ mise tasks rm check --dry-run
mise task check would be removed from /path/to/project/mise.toml
$ mise tasks rm check --yes --json
[
{
"task": "check",
"action": "removed",
"kind": "toml",
"path": "/path/to/project/mise.toml",
"table": {
"depends": ["test"],
"description": "Quick sanity echo after tests",
"run": "echo ok"
},
"newly_trusted": false,
"dry_run": false
}
]
官方提醒:没有终端可提问时,rm 必须 --yes(或 MISE_YES=1);任务若被多个已加载配置文件同时定义,set / rm 会停下来列出文件,让你用 --path 选一个。从 package.json 推断出来的任务,以及 include 进来的定义,rm 会拒绝。
主线第二段是 watch --once。官方写法:等一次源码变更 → 用 mise run 跑任务一次 → 以该次状态退出;启动时什么都不跑(隐含 --postpone);Ctrl-C 退出码 130;等待期间 SIGTERM 则直接退、不跑任务。和 Spring 测试咬合的用法:
# 终端 A:阻塞等待
$ mise watch test --once
# (此处尚无输出,test 未启动)
# 终端 B:改测试源,例如给 DemoApplicationTests 加一行注释
# 保存后终端 A:
[test] $ mvn -q test
$ echo $?
0
把断言故意改坏再来一轮,Surefire 失败后 watch 跟着失败退出:
[test] $ mvn -q test
[ERROR] Tests run: 1, Failures: 1, Errors: 0, Skipped: 0, Time elapsed: 0.049 s <<< FAILURE! -- in com.example.demo.DemoApplicationTests
[ERROR] com.example.demo.DemoApplicationTests.greetingLengthMatches -- Time elapsed: 0.029 s <<< FAILURE!
org.opentest4j.AssertionFailedError: expected: <99> but was: <12>
...
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:3.5.3:test (default-test) on project mise-demo: There are test failures.
[test] ERROR task failed
# 退出码 1
等待阶段按 Ctrl-C,本机实测退出码是 130,且没有触发 mvn test。脚本里可以写成 mise watch test --once && echo "tests pass after the change":agent 改完文件后阻塞到测试结束,再看 shell 状态决定下一步。
注意 --once 和普通常驻 watch 的旗标不兼容:官方拒绝 --restart、--clear 这类「如何让 watchexec 反复跑」的选项,因为这一模式下任务由 mise 自己跑一轮就结束。任务若声明了 sources(本例是 src/**/*.java 与 pom.xml),watch 就盯这些;否则默认盯当前目录。
整条链路对 Spring Boot 日常开发很直:TOML 里的 test / package 不用开编辑器也能改 description、command、depends;agent 或脚本用 watch --once 等你改完 Java,再拿一轮 Maven Surefire 的退出码当门禁。同版本还有 opt-in 的 env_cache_redacted、以及若干 install / lockfile / reshim 修复,主线仍是 tasks CLI 编辑和 watch --once。
一起交流
分享你的思考,让讨论更进一步。