☰
mise 任务交互式选择器:用 `mise run` 无参调用直接在终端中挑选并执行任务
2026/10/7 9:46:50 网站建设 项目流程
  • 文档
  • 教程
  • 知识库

【免费下载链接】til

:memo: Today I Learned

项目地址:https://gitcode.com/gh_mirrors/ti/til
点击查看免费下载

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确认即执行,把"记命令名"变成"从菜单里挑"。要让这个选择器真正顺手,可以配合两件事:

  1. 命名:用console:staging、test:all这类带命名空间的任务名,让菜单按前缀自然分组;
  2. 组织:用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

项目地址:https://gitcode.com/gh_mirrors/ti/til
点击查看免费下载
上一篇:Azure Communication SMS Java 实战指南:基于 azure-communication-sms-java 技能实现短信通知、批量群发与投递报告
下一篇:GitHub520终极指南:5分钟解决GitHub访问慢和图片加载失败问题

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询