ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

mise tasks ls 深度解析:如何列出、过滤与排序 mise 中所有可用任务

mise tasks ls 深度解析:如何列出、过滤与排序 mise 中所有可用任务 mise tasks ls 深度解析如何列出、过滤与排序 mise 中所有可用任务【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise本篇围绕mise tasks ls命令展开讲解它如何从全局配置到项目目录逐级合并任务来源、支持哪些过滤与排序参数以及如何以表格、JSON、纯名称三种形态输出。读完后你可以直接在项目中用它审计任务清单、排查任务找不到问题并把任务列表接入 fzf 补全或 CI 脚本。命令概览mise tasks ls用于列出当前可用的所有任务tasks。基本用法为mise tasks ls [FLAGS]该命令为**只读read-only**操作不会触发任何任务的执行。其实现位于 src/cli/tasks/ls.rs输出通过MiseTable表格组件渲染。任务可以来自两类来源配置文件中的[tasks.*]内联定义例如mise.toml里的run ...任务任务目录中的可执行文件默认是.mise/tasks/也可通过[task_config].includes指向其他目录或 TOML 文件。任务来源的目录层级合并官方文档 docs/cli/tasks/ls.md 对合并规则有明确描述所有父目录中的任务都会合并进当前列表。例如全局任务放在~/.config/mise/tasks/*项目任务放在~/myproject/.mise/tasks/*两者都会出现在列表中但同名的项目级任务会覆盖全局任务。这一覆盖语义可以从源码得到印证。src/cli/tasks/ls.rs 中通过config.tasks_with_context(ctx)一次性拿到合并后的任务集合BTreeMapString, Task以任务名为键因此同名任务在合并阶段就已完成去重后加载的高优先级来源会占据同一键位。任务集合的加载与缓存逻辑在 src/config/mod.rstasks()与tasks_with_context(ctx)分别对应当前目录层级与整个 monorepo两种加载视图加载结果按上下文缓存避免重复扫描磁盘。各来源任务的优先级includes列表中靠后的项覆盖靠前的项父目录配置被子目录配置覆盖详见 docs/tasks/task-configuration.md 中[task_config].includes一节。完整参数说明以下为 docs/cli/tasks/ls.md 列出的全部参数并结合 src/cli/tasks/ls.rs 的结构体定义补充了冲突与互斥关系参数说明-g, --global只显示全局任务与--local互斥源码中标注overrides local-J, --json以 JSON 格式输出-l, --local只显示非全局任务与--global互斥-x, --extended显示所有列Name、Aliases、Source、Description--all加载整个 monorepo 的全部任务包括兄弟目录默认只加载当前目录层级--hidden显示被标记hide true的隐藏任务--name-only每行仅输出一个任务名方便管道传给 fzf 等工具不能与--json、--extended即-x同时使用--no-header不打印表头别名--no-headers--sort COLUMN按列排序取值为name、alias、description、source默认name--sort-order SORT_ORDER排序方向取值为asc、desc默认asc-h, --help打印帮助从源码看参数冲突在合并阶段就做了校验src/cli/tasks/ls.rs 中若同时出现--name-only与--json/--extended/--usage会直接报错--name-only cannot be used with --json, --extended, or --usage。e2e 测试 e2e/tasks/test_task_ls_global 中的assert_fail mise tasks --name-only ls --json ...正是对该报错的断言。表格输出与--extended模式默认输出是两列表格Name加粗与Description变暗色显示。加上-x/--extended后变为四列Name、Aliases、Source、Description。列定义见 src/cli/tasks/ls.rs 中display()方法extended为 true 时表头是[Name, Aliases, Source, Description]否则是[Name, Description]。e2e 测试 e2e/tasks/test_task_ls 给出了一个完整的可复现实验在一个包含mise.toml[tasks.lint]、tasks.toml[test]与[test-with-args]、.mise/tasks/do-not-show文件任务、mytasks/自定义任务目录以及.config/mise/conf.d/配置的任务列表中运行mise tasks ls输出按名称排序confdtask filetask2 filetask3 lint test test-with-args再运行mise tasks -x ls可以看到每个任务的来源文件confdtask ./.config/mise/conf.d/confdtask-config.toml filetask2 ./mytasks/filetask2 filetask3 ./mytasks/filetask3.sh lint ./mise.toml test ./tasks.toml test-with-args ./tasks.toml这个例子同时验证了三种来源的合并[task_config].includes指定的额外 TOML 文件tasks.toml、额外任务目录mytasks/以及 conf.d 配置文件中的[tasks.*]定义。注意该测试中.mise/tasks/do-not-show没有描述也不会影响列表而文件任务名就是文件名filetask3.sh显示为filetask3.sh来源任务名去除路径。--json输出结构化任务元数据--json短写-J输出一个 JSON 数组每项包含任务的完整元数据。源码中display_json()src/cli/tasks/ls.rs输出的字段包括name/aliases/description任务身份与说明source与config_sources任务定义所在配置文件及全部参与来源depends/depends_post/wait_for任务依赖关系env任务环境变量的字符串形式dir解析后的实际运行目录含继承自task_config.dir的值源码注释特别说明这是任务实际会运行的目录hide/global是否隐藏、是否全局任务raw/interactive/quiet/silent执行行为开关sources/outputs缓存的输入与输出声明shell/tools/usage/timeout运行环境与工具约束run/args/file内联运行命令、参数与文件任务路径。e2e/tasks/test_task_ls 中用assert_json mise tasks ls --json对完整 JSON 做了逐字段断言可作为字段语义的权威参照e2e/tasks/test_task_ls_json_resolved_dir 则专门验证dir字段的解析行为。--name-only接入 fzf 与脚本--name-only每行输出一个任务显示名display_name实现非常直接——src/cli/tasks/ls.rs 中循环打印t.display_name。典型用法mise run $(mise tasks ls --name-only | fzf)从 e2e/tasks/test_task_ls_name_only 可以看到它与其他参数的组合能力与--no-header组合输出不变名称模式本来就没有表头与--sort name --sort-order desc组合可改变名称列表顺序与--global/--local组合可按作用域过滤如mise tasks ls --name-only --global只输出全局任务名与--json、-x、--usage组合会按前述规则报错。--sort与--sort-order排序由 src/cli/tasks/ls.rs 中的sort()方法实现--sort name默认按任务名比较--sort alias按别名列表拼接后的字符串比较--sort description按描述比较--sort source按来源配置路径比较。--sort-order desc将比较结果反转默认asc。注意排序只影响显示顺序不影响任务执行顺序——依赖关系depends、depends_post、wait_for在mise run时才起作用。--all与 monorepo 全量任务--all用于 monorepo 场景加载整个 monorepo包括兄弟目录的任务而默认只加载当前目录层级。其底层机制在 src/task/task_load_context.rsTaskLoadContext::all()将load_all置为true此时should_load_subdir()对任意子目录都返回true即不裁剪默认上下文中path_hints为空且load_all为false只加载当前目录层级对于形如//foo/bar:task的模式from_pattern()会提取foo/bar作为路径提示只加载精确匹配、其子目录与父目录见 src/task/task_load_context.rs 中should_load_subdir()的三个条件以在大型仓库中减少扫描范围。docs/cli/tasks/ls.md 中的说明也强调--all加载 monorepo 全量任务默认只加载当前目录层级。monorepo 任务的//path:task寻址语法详见 docs/tasks/monorepo.md。--global与--local过滤过滤逻辑在run()方法的链式 filter 中src/cli/tasks/ls.rs.filter(|t| self.hidden || !t.hide) // --hidden 控制隐藏任务 .filter(|t| !self.local || !t.global) // --local 时过滤掉全局任务 .filter(|t| !self.global || t.global) // --global 时只保留全局任务一个任务的global属性由其定义来源决定来自全局配置如~/.config/mise/下的配置与任务目录的任务为全局任务。e2e/tasks/test_task_ls_global 构造了~/.config/mise/tasks/文件任务、conf.d 配置任务、MISE_SYSTEM_CONFIG_FILE系统级任务与项目本地任务断言mise tasks默认列出全部 8 个任务mise tasks --local只列出mylocalmise tasks --global列出其余 6 个全局任务。测试还验证了参数位置灵活性mise tasks ls --local与mise tasks --local ls输出相同同时确认列表类参数不能与查看单个任务混用如mise tasks mylocal --local会报task list options cannot be used with task info。--hidden与hide属性标记hide true的任务配置写法见 docs/tasks/task-configuration.md 的hide一节默认不出现在列表中加--hidden后才会显示。注意源码中的过滤顺序--hidden只是不过滤它并不隐藏原本可见的任务即--hidden下会同时显示普通任务和隐藏任务。空结果时的可执行文件提示一个容易被忽略的实用细节当完全没有任何任务而非被过滤掉任务时mise tasks ls会检查任务目录中是否存在缺少可执行位的文件并打印警告提示你去加chmod x。逻辑见 src/cli/tasks/ls.rs调用 src/task/task_list.rs 中的find_non_executable_task_files()遍历 includes 目录找出非隐藏、非排除且不可执行的文件给出make_executable_hint提示。这在新写了一个脚本放进.mise/tasks/却跑不起来的场景下非常有用。相关行为有专门的 e2e 测试 e2e/tasks/test_task_non_executable_error。远程任务与TaskFetcher列表构建前还有一个步骤解析远程任务remote task。src/cli/tasks/ls.rs 中TaskFetcher::new(false).fetch_tasks(...)会在展示前把声明为远程的本地任务拉取到位no_cache固定传false因为该命令不接受--no-cache但环境变量MISE_TASK_REMOTE_NO_CACHE仍然生效。远程任务的协议见 docs/tasks/remote-cache-protocol.md。典型工作流示例综合以上能力几个常见用法# 1. 快速浏览当前项目所有任务 mise tasks ls # 2. 查看每个任务来自哪个文件用于排查同名覆盖 mise tasks ls --extended # 3. monorepo 中列出全部包的任务 mise tasks ls --all # 4. 按描述排序 mise tasks ls --sort description --sort-order desc # 5. 输出给脚本/Agent 消费 mise tasks ls --json | jq .[].name # 6. 交互式选择并运行 mise run $(mise tasks ls --name-only | fzf)相关文档Task 配置参考[tasks.*]与[task_config]全部选项mise tasks父命令run、deps、validate等子命令monorepo 任务组织//path:task语法与monorepo_root配置实现源码参数解析、过滤、排序与三种输出模式。【免费下载链接】misedev tools, env vars, task runner项目地址: https://gitcode.com/GitHub_Trending/mi/mise创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进