名称: commander-js-脚手架 描述: 使用 TypeScript、命令、选项和最佳实践生成 Commander.js CLI 项目结构。创建一个完整的脚手架 CLI 应用程序,准备进行开发。 允许的工具: 读取, 写入, 编辑, Bash, Glob, Grep
Commander.js 脚手架
使用 TypeScript、适当的项目结构和最佳实践生成一个完整的 Commander.js CLI 应用程序。
功能
- 生成基于 TypeScript 的 Commander.js CLI 项目
- 创建包含子命令和选项的命令结构
- 设置具有类型强制的适当参数解析
- 配置帮助文本生成
- 实现版本管理
- 设置构建和开发工作流
用法
当您需要以下情况时,请调用此技能:
- 使用 Commander.js 引导一个新的 CLI 应用程序
- 创建具有适当结构的 TypeScript CLI
- 设置包含子命令的命令层次结构
- 配置 CLI 选项和参数
输入
| 参数 | 类型 | 是否必需 | 描述 |
|---|---|---|---|
| 项目名称 | 字符串 | 是 | CLI 项目的名称(kebab-case) |
| 描述 | 字符串 | 是 | CLI 的简短描述 |
| 命令 | 数组 | 否 | 要搭建脚手架的命令列表 |
| typescript | 布尔值 | 否 | 使用 TypeScript(默认:true) |
| 包管理器 | 字符串 | 否 | npm、yarn 或 pnpm(默认:npm) |
命令结构
{
"commands": [
{
"name": "init",
"description": "初始化一个新项目",
"options": [
{ "flags": "-t, --template <name>", "description": "要使用的模板" },
{ "flags": "-f, --force", "description": "覆盖现有文件" }
],
"arguments": [
{ "name": "<directory>", "description": "目标目录" }
]
}
]
}
输出结构
<项目名称>/
├── package.json
├── tsconfig.json
├── .gitignore
├── README.md
├── src/
│ ├── index.ts # 入口点,包含 shebang
│ ├── cli.ts # 主 CLI 设置
│ ├── commands/
│ │ ├── index.ts # 命令导出
│ │ └── <command>.ts # 单个命令
│ ├── utils/
│ │ ├── logger.ts # 日志工具
│ │ └── config.ts # 配置助手
│ └── types/
│ └── index.ts # 类型定义
├── bin/
│ └── <项目名称> # 编译后的二进制入口
└── tests/
└── commands/
└── <command>.test.ts
生成的代码模式
主 CLI 入口 (src/cli.ts)
import { Command } from 'commander';
import { version } from '../package.json';
const program = new Command();
program
.name('<项目名称>')
.description('<描述>')
.version(version, '-v, --version', '显示版本号');
// 注册命令
program.addCommand(initCommand);
program.addCommand(buildCommand);
// 全局选项
program
.option('-d, --debug', '启用调试模式')
.option('-q, --quiet', '抑制输出');
// 错误处理
program.exitOverride();
try {
program.parse();
} catch (err) {
// 优雅地处理错误
}
命令模板 (src/commands/<名称>.ts)
import { Command } from 'commander';
export const <名称>Command = new Command('<名称>')
.description('<描述>')
.argument('<必需参数>', '必需参数描述')
.argument('[可选参数]', '可选参数描述')
.option('-o, --option <值>', '选项描述', '默认值')
.action(async (必需参数, 可选参数, 选项) => {
// 命令实现
});
依赖项
{
"dependencies": {
"commander": "^12.0.0"
},
"devDependencies": {
"@types/node": "^20.0.0",
"typescript": "^5.0.0",
"tsx": "^4.0.0",
"vitest": "^1.0.0"
}
}
工作流
- 验证输入 - 检查项目名称、命令结构
- 创建目录结构 - 设置文件夹和基础文件
- 生成 package.json - 配置项目元数据和脚本
- 生成 tsconfig.json - TypeScript 配置
- 创建 CLI 入口点 - 主程序设置
- 生成命令 - 单个命令文件
- 创建工具 - 日志记录器、配置助手
- 设置测试 - 命令的测试结构
- 初始化 git - 可选的 git 初始化
应用的最佳实践
- 启用 TypeScript 严格模式
- 使用 exitOverride 进行适当的错误处理
- 一致的命令命名约定
- 帮助文本格式化标准
- 版本标志配置
- 调试/详细模式支持
- 优雅的错误消息
参考
- Commander.js 文档:https://github.com/tj/commander.js
- Commander.js 示例:https://github.com/tj/commander.js/tree/master/examples
- Node.js CLI 最佳实践:https://clig.dev/
目标流程
- cli-应用程序引导
- cli-命令结构设计
- 参数解析器设置