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。

参考:https://github.com/jdx/mise/releases/tag/v2026.10.25

— 感谢阅读 —
广告

一起交流

分享你的思考,让讨论更进一步。