SuperAPI AI 工具集

cli-tool-design

编程与开发

查看项目

更新于 10-15 09:40

技能介绍

CLI Tool Design 是一份关于命令行工具设计的技能资料,目标是帮助开发者构建可发现、可组合、易用的命令行程序。以下按用途、主要能力、使用方式、适用场景和限制进行整理。

一、用途 该技能用于指导命令行界面(CLI)的设计与实现,覆盖参数解析、子命令、帮助文本、输出格式化与退出码等方面,并涉及 Click、Typer、argparse 及 shell 相关实践。

二、设计原则 资料强调将 UNIX 哲学应用于 CLI 设计,包含四点:

  • 做好一件事:每个命令有清晰且单一的目的;
  • 通过管道组合:支持 stdin/stdout 以便串联;
  • 大声失败:错误使用非零退出码并写入 stderr;
  • 可预测:保持一致的标志与一致的输出格式。

三、命令结构 资料给出的结构为: program [global-options] command [command-options] [arguments] 示例: organvm --verbose registry update --organ IV a-i--skills

四、框架选型 资料提供了一个对比表:

  • Typer / Python:适合使用类型提示、自动补全的现代 CLI;
  • Click / Python:适合复杂 CLI、插件与嵌套命令组;
  • argparse / Python:适合零依赖、仅用标准库的场景;
  • clap / Rust:适合高性能、编译型 CLI;
  • cobra / Go:适合 Go 微服务的 CLI。

五、使用方式(以 Typer 为例)

  1. 基础命令:定义 typer.Typer 应用并设置 help;使用 @app.command() 定义命令,参数使用 typer.Argument,选项使用 typer.Option,并可配置短选项(如 -v)、默认值与帮助文本。
  2. 子命令组:通过 app.add_typer(registry_app, name="registry") 挂载子命令组,再在子应用上定义命令(如 registry update),支持 --dry-run/-n 等选项。
  3. Rich 输出集成:从 rich.console 引入 Console(示例中 console = Console(stderr=True),即状态输出到 stderr),从 rich.table 引入 Table,按列设置样式与标题并逐行添加数据后打印表格。

六、参数设计 资料给出位置参数与可选参数的对应关系:

  • 必需输入:位置参数,例如 program FILE;
  • 行为修饰:标志,例如 --verbose、--dry-run;
  • 配置:选项,例如 --output FORMAT;
  • 多输入:可变参数,例如 program FILE...。 常用标志约定包括:-v/--verbose 提升输出详细度;-q/--quiet 抑制非错误输出;-n/--dry-run 只展示将要发生的事而不执行;-f/--force 跳过确认提示;-o/--output FILE 将输出写入文件而非 stdout;--json 输出机器可读 JSON;--no-color 关闭彩色输出。布尔标志可通过 --color/--no-color、--interactive/--no-interactive 这类否定写法实现。

七、输出设计 资料区分人类可读与机器可读输出:可通过 json_mode 判断,机器输出使用 json.dump 输出到 stdout,人类输出则使用带格式的 console.print。进度展示可使用 rich.progress 的 track。输出通道约定为:stdout 承载数据输出(可管道传递),stderr 承载状态消息、进度与错误。

八、退出码 资料列出常见退出码:0 成功;1 一般错误;2 用法错误(参数错误);64-78 为 BSD sysexits 约定;130 表示被中断(Ctrl+C)。示例中在失败时向 stderr 输出错误并抛出 SystemExit(1),捕获 KeyboardInterrupt 时抛出 SystemExit(130)。

九、配置加载 配置优先级从高到低为:命令行参数、环境变量、项目级配置文件(.tool.yaml)、用户级配置(~/.config/tool/config.yaml)、系统默认值。示例函数按该顺序逐级取值,最后回退到 DEFAULT_VALUE。

十、Shell 补全 Typer 支持自动补全,可通过 my-cli --install-completion 生成补全脚本,或手动使用 _MY_CLI_COMPLETE=bash_source my-cli > ~/.my-cli-complete.bash 并 source 该文件。自定义补全通过 autocompletion 参数传入函数实现,示例中对 organ 的候选值(I、II、III、IV、V、VI、VII、META)按前缀过滤。

十一、测试 资料使用 typer.testing 的 CliRunner 编写测试:调用 runner.invoke(app, [...]),断言 result.exit_code 与 result.stdout 内容,并演示了无效参数时退出码为 2 的测试。

十二、反模式 资料列出需要避免的做法:在脚本中强制交互输入(应始终支持 --yes / --no-interactive 标志);把数据与状态混在 stdout(进度和状态应走 stderr);标志命名不一致(应选定约定并在所有子命令中保持一致);缺少帮助文本(每个命令、参数和选项都需要帮助字符串);吞掉错误(失败时必须使用适当的非零退出码)。

十三、适用场景 基于上述内容,该技能适用于设计与实现命令行工具的开发者,尤其是使用 Python(Typer、Click、argparse)的团队,也包含 Rust(clap)与 Go(cobra)的选型参考。

十四、限制 资料未提供具体的定价、收费、平台适配范围、性能指标或效果数据;相关事实暂未提供。