- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
mise不仅能用统一语法管理 Node、Ruby、Postgres 等工具的版本,还内置了任务(task)系统,可以把日常高频命令(如连接各种环境的 Rails console、跑测试)沉淀为可复用的快捷键。本篇以 TIL(Today I Learned)仓库中的实战笔记 pick-from-tasks-using-interactive-picker.md 为骨架,讲解当项目配置了多个mise任务时,如何直接执行mise run触发内置的交互式选择器:在终端菜单中浏览、筛选、确认并执行任务,同时结合仓库内其他 mise 笔记(通配符聚合任务、颜色输出、配置加载排查)做纵深补充。
读完本文,你将掌握mise.toml中任务的定义格式、mise run无参数时交互式选择器的完整操作方式(方向键导航、j/k移动、输入过滤、enter确认),并能把它与depends通配符、unbuffer等技巧组合成更顺手的日常工作流。
场景:为不同环境封装 Rails console 快捷任务
在真实项目中,开发者经常需要反复连接不同环境的控制台。与其每次手敲一长串ssh+dokku命令,不如把它们定义成mise任务。原笔记的作者在 Add Mise Tasks For Common Workflow Commands 中介绍过这套思路:为rails console在不同环境的连接方式分别添加任务。
在项目根目录的mise.toml中,任务以 TOML 表格形式定义,键名tasks."console:staging"中的冒号让任务天然具备命名空间分组的语义:
# mise.toml [tasks."console:staging"] description = "Open a Rails console on staging" run = "ssh -t my-app-staging dokku run my-app rails console" [tasks."console:prod"] description = "Open a Rails console on production" run = "ssh -t my-app-prod dokku run my-app rails console"其中:
[tasks."任务名"]:任务表头,任务名需用引号包裹,冒号分隔的层级(如console:staging)会被mise当作任务的分组结构,交互式选择器中也按此分组展示;description:任务的说明文字,在交互式选择器中显示在任务名右侧,帮助你在菜单里快速辨认每个任务的作用;run:任务实际执行的 shell 命令,支持字符串,也支持多行字符串或命令数组(仓库笔记 create-umbrella-task-for-all-test-tasks.md 展示了run = [...]数组写法)。
当项目里积累了多个这样的任务,逐个记住名字再敲mise run console:prod会带来记忆负担——这正是交互式选择器派上用场的时机。
触发交互式选择器:mise run不带任何参数
mise任务系统的一个设计是:当项目配置了多个任务时,直接执行mise run而不带任何任务名参数,它会启动一个内置的交互式选择器(interactive picker),把所有任务填充进终端菜单,让你用键盘挑选。
❯ mise run Tasks Select a task to run ❯ console:prod Open a Rails console on production console:staging Open a Rails console on staging / esc clear filter • enter confirm从上面的运行界面可以看到选择器的几个关键信息:
- 顶部
Tasks与Select a task to run是标题与提示语; ❯标记当前高亮的候选任务,右侧紧跟着该任务的description;- 底部状态栏显示快捷键提示:
esc clear filter • enter confirm,即esc用于清除过滤器、enter用于确认执行。
从仓库内其他 mise 笔记可见,任务数量与配置来源并非凭空而来——mise会加载项目内外的多个配置文件来收集可运行的任务,这一点在 list-the-files-being-loaded-by-mise.md 中有详细排查案例(mise cfg可列出实际加载的文件及各自声明的工具)。也就是说,交互式选择器里出现的任务列表,正是这些配置文件中[tasks.*]定义汇总后的结果。
浏览与筛选:方向键、j/k 与输入过滤
交互式选择器沿用了终端菜单工具常见的操作习惯:
- 上下移动:默认按方向键(
↑/↓)在候选项之间导航; - 退出过滤模式:按
esc键退出filter(过滤)模式,此时j/k也分别对应向下、向上移动,与 Vim 系编辑器的按键习惯一致; - 过滤候选:处于filter模式时,直接在提示符中输入文本,选择器会把任务列表实时过滤到仅剩部分匹配(partial match)的项。
这条"输入即过滤、按esc切换回纯导航"的交互模型,与仓库中 Taskfile.yml 里notes任务借助fzf --prompt实现"交互式挑选并执行"的做法(browse、notes两个任务都标记为interactive: true)如出一辙——都是把"从一组命令里挑一个执行"的过程交给终端交互组件完成,只是mise把这一能力内置进了mise run。
确认执行:按下 enter
当通过方向键或过滤把目标任务高亮到❯位置后,按下enter,该任务即被确认并立即执行。例如高亮console:prod后回车,就会执行对应的ssh -t my-app-prod dokku run my-app rails console。
这一步把"回忆任务名 + 手敲命令"简化成了"打开菜单 + 回车确认",尤其适合任务名较长、环境较多的情况——多环境 console 场景下,相比敲mise run console:staging,先mise run再从菜单里选,误操作概率更低,也省去了记忆成本。
进阶:把交互式选择器与任务组织技巧组合
交互式选择器之所以好用,前提是任务定义得井井有条。结合仓库内同目录下的其他笔记,可以进一步优化任务的组织与执行体验。
用通配符 depends 聚合任务,让菜单更整洁
在 create-umbrella-task-for-all-test-tasks.md 中,作者把多个测试任务用一个伞形任务(umbrella task)聚合起来,避免重复复制run命令:
[tasks."test:rspec"] run = "unbuffer bundle exec rspec" description = "Run RSpec tests" depends = ["bundle-install"] [tasks."test:vitest"] run = "unbuffer yarn test run" description = "Run Vitest tests" depends = ["node-install"] [tasks."test:all"] description = "Run all tests (RSpec and Vitest)" depends = ["test:*"]depends = ["test:*"]让test:all不执行自己的命令,而是通过依赖关系串起所有test:*任务。这一模式的价值在于:
- 新增测试类型(如
test:e2e)时无需改动test:all,天然向前兼容; mise run "test:**"也能直接批量调用所有测试任务;- 配合本篇主题,
console:、test:这类冒号前缀命名让任务在交互式选择器中按前缀聚类,菜单更清晰、过滤更精准。
用 unbuffer 保住任务输出的颜色
交互式选择器解决的是"选哪个任务",而 preserve-color-output-for-task-command.md 解决的是"执行时的输出体验":测试命令经mise执行时,测试运行器会认为自己不在交互模式,从而丢失绿(通过)、红(失败)、黄(跳过)等颜色。解决方式是用expect附带安装的unbuffer强制命令以交互模式运行:
[tasks."test:all"] run = """ unbuffer bundle exec rspec unbuffer yarn test run """ description = "Run all tests (RSpec and Vitest)" depends = ["bundle-install", "node-install"]查看任务背后的配置加载情况
如果交互式选择器里出现了意料之外的任务或工具下载行为,可以用mise cfg排查mise实际加载了哪些文件(见 list-the-files-being-loaded-by-mise.md),并用.mise.local.toml在不改动版本控制文件的前提下覆盖项目级配置(见 override-your-project-mise-file.md),确保任务定义符合预期。
小结
mise run的无参调用是任务系统内置的一项贴心能力:当项目中定义了多个任务时,它会自动呈现一个支持方向键导航、j/k移动、输入过滤的交互式选择器,enter确认即执行,把"记命令名"变成"从菜单里挑"。要让这个选择器真正顺手,可以配合两件事:
- 命名:用
console:staging、test:all这类带命名空间的任务名,让菜单按前缀自然分组; - 组织:用
depends = ["test:*"]通配符做聚合任务,用unbuffer保留输出颜色,必要时用mise cfg核查任务来源。
对于频繁切换环境、反复运行固定命令的开发者,这套"定义任务 + 交互式挑选"的工作流能明显减少日常的机械输入。更多 mise 实战细节可继续阅读仓库中的 create-umbrella-task-for-all-test-tasks.md、preserve-color-output-for-task-command.md 与 list-the-files-being-loaded-by-mise.md。
- 文档
- 教程
- 知识库
【免费下载链接】til
:memo: Today I Learned
相关推荐
`mise generate task-stubs`:为 mise 任务生成可直接执行的 stub 脚本
mise generate task stubs :为 mise 任务生成可直接执行的 stub 脚本 mise generate task stubs 是 m
开发工具CLImise tasks run 命令深度解析:任务运行、并行调度与输出缓存控制
mise tasks run 命令深度解析:任务运行、并行调度与输出缓存控制 mise tasks run 别名 mise run / mise r 是 mis
开发工具CLImise run 命令完全指南:任务调度、新鲜度检查、缓存与沙箱执行
mise run 命令完全指南:任务调度、新鲜度检查、缓存与沙箱执行 mise run (别名 r )是 mise 的任务执行入口,负责发现、调度并运行项目中定
开发工具CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考