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 为例)
- 基础命令:定义 typer.Typer 应用并设置 help;使用 @app.command() 定义命令,参数使用 typer.Argument,选项使用 typer.Option,并可配置短选项(如 -v)、默认值与帮助文本。
- 子命令组:通过 app.add_typer(registry_app, name="registry") 挂载子命令组,再在子应用上定义命令(如 registry update),支持 --dry-run/-n 等选项。
- 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)的选型参考。
十四、限制 资料未提供具体的定价、收费、平台适配范围、性能指标或效果数据;相关事实暂未提供。