首页
学习
活动
专区
圈层
工具
发布
50 篇文章
1
【架构师(第一篇)】整体需求分析和架构设计
2
【架构师(第二篇)】脚手架架构设计和框架搭建
3
【架构师(第三篇)】脚手架开发之掌握Lerna操作流程
4
【架构师(第四篇)】脚手架开发之Lerna源码分析
5
【架构师(第五篇)】脚手架之import-local执行流程及简历设计
6
【架构师(第六篇)】脚手架之需求分析和架构设计
7
【架构师(第七篇)】脚手架之准备阶段编写
8
【架构师(第八篇)】脚手架之 commander 框架使用方法
9
【架构师(第九篇)】如何让 Node 环境支持 ES Module
10
【架构师(第十篇)】脚手架之注册命令及架构优化
11
【架构师(第十一篇)】脚手架之命令注册和执行过程开发
12
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法
13
【架构师(第十三篇)】脚手架之创建项目准备阶段开发
14
【架构师(第十四篇)】脚手架之 egg.js 和 mongodb 的使用
15
【架构师(第十五篇)】脚手架之创建项目模板开发
16
【架构师(第十六篇)】脚手架之创建项目模板的下载与更新
17
【架构师(第十七篇)】脚手架之 ejs 和 glob 的使用
18
【架构师(第十八篇)】脚手架之项目模板的安装
19
【架构师(第十九篇)】脚手架之组件库模板开发
20
【架构师(第二十篇)】脚手架之自定义模板及第一阶段总结
21
【架构师(第二十一篇)】编辑器开发之需求分析和架构设计
22
【架构师(第二十二篇)】编辑器开发之项目整体搭建
23
【架构师(第二十三篇)】编辑器开发之画布区域组件的渲染
24
【架构师(第二十四篇)】编辑器开发之添加模版到画布
25
【架构师(第二十五篇)】编辑器开发之属性编辑区域表单渲染
26
【架构师(第二十六篇)】编辑器开发之属性编辑同步渲染
27
【架构师(第二十七篇)】前端单元测试框架 Jest 基础知识入门
28
【架构师(第二十八篇)】 测试工具 Vue-Test-Utils 基础语法
29
【架构师(第二十九篇)】Vue-Test-Utils 触发事件和异步请求
30
【架构师(第三十篇)】Vue-Test-Utils 全局组件和第三方库 vuex | vue-router
31
【架构师(第三十一篇)】前端测试之 TDD 的开发方式
32
【架构师(第三十二篇)】 通用上传组件开发及测试用例
33
【架构师(第三十三篇)】 Vue 中的实例及本地图片预览
34
【架构师(第三十四篇)】 业务组件库开发之 vue3 的插件系统
35
【架构师(第三十五篇)】 业务组件库开发之使用 Rollup 进行打包
36
【架构师(第三十六篇)】 业务组件库开发之发布到 NPM
37
【架构师(第三十七篇)】 服务端开发之后端框架与数据库技术选型
38
【架构师(第三十八篇)】 服务端开发之本地安装最新版 MySQL 数据库
39
【架构师(第三十九篇)】 服务端开发之连接 MySQL 数据库
40
【架构师(第四十篇)】 服务端开发之连接 Mongodb 数据库
41
【架构师(第四十一篇)】 服务端开发之安装并连接 Redis数据库
42
【架构师(第四十二篇)】 服务端开发之常用的登录鉴权方式
43
【架构师(第四十三篇)】 服务端开发之单元测试和接口测试
44
【架构师(第四十四篇)】 服务端开发之 pm2 和 nginx 介绍
45
【架构师(第四十五篇)】 服务端开发之认识 Github actions
46
【架构师(第四十六篇)】 服务端开发之安装 Docker
47
【架构师(第四十七篇)】 服务端开发之认识 Docker
48
【架构师(第四十八篇)】 服务端开发之 Dockerfile
49
【架构师(第四十九篇)】 服务端开发之认识 Docker-compose
50
【架构师(第五十篇)】 服务端开发之自动发布到测试机
清单首页架构文章详情

【架构师(第八篇)】脚手架之 commander 框架使用方法


commander 用法

安装

代码语言:javascript
复制
npm i -S commander

创建脚手架实例

代码语言:javascript
复制
// 方法一 获取 commander 脚手架单例
const { program } = commander;

// 方法二 手动创建新的 commander 实例
const program = new commander.Command();

使用

代码语言:javascript
复制
program
  .name(Object.keys(pkg.bin)[0]) // 设置 usage 的 name 
  .usage('<command>[options]') // 设置 usage 的 message
  .parse(process.argv); // 解析参数
代码语言:javascript
复制
program
  .version(pkg.version) // 设置 Version 命令
  .parse(process.argv); // 解析参数
代码语言:javascript
复制
program
  .option('-d, --debug', '是否开启调试模式?', true) // 创建 debug 命令 , 第三个参数:是否默认开启
  .option('-e, --envName <envName>', '获取环境变量名称') // 创建 envName 命令
  .parse(process.argv); // 解析参数

其他常用 api

可以拿到参数以及默认值

代码语言:javascript
复制
// 打印出命令的 options
console.log(program.opts());

可以看到没有输入 -h 或者 --help ,依然打印出来帮助信息

代码语言:javascript
复制
// 打印出帮助信息
program.outputHelp();

注册命令

方法一: command 注册命令

代码语言:javascript
复制
const clone = program.command('clone <source> [destination]');
clone
  .description('克隆一个仓库')
  .option('-f, --force', '是否强制克隆') // 注册 clone 命令下的 option
  .action((source, destination, cmdObj) => {
    console.log('do clone', source, destination, cmdObj);
  });

方法二: addCommand 注册命令

代码语言:javascript
复制
// 创建一个新的命令
const service = new commander.Command('service').description('启动一个服务');

// 添加子命令
service
  .command('start [port]')
  .description('启动服务')
  .action((port) => {
    console.log(`服务启动于${port}`);
  });

// 添加子命令
service
  .command('stop')
  .description('停止服务')
  .action(() => {
    console.log('服务停止了');
  });

// 把命令添加到脚手架中
program.addCommand(service);

匹配所有命令

代码语言:javascript
复制
// 匹配所有不存在的命令
program
  .arguments('<cmd> [option]')
  .description('友情提示:', {
    cmd: '要有一个必须的命令',
    option: '有一个可选的参数',
  })
  .action((cmd, option) => {
    console.log(cmd, option);
  });

<> 代表必须,[] 代表可选。必须要有一个命令。

-h 的时候会出现提示

脚手架互相调用

将脚手架名称拼上 install,去执行新的命令,如:test-cli-install

代码语言:javascript
复制
// 执行新的命令,用于脚手架之间互相调用
program
  .command('install [name]', 'install package', {
    executableFile: 'hzw-cli-dev', // 切换要执行的命令名称 
    isDefault: true, // 默认执行这个命令
    hidden: true, // 隐藏命令
  })
  .alias('i');

PS:这个不知道为啥和演示的不一样,我执行这个就是去找模块了,有可能是版本的问题。

高级定制 自定义 help 信息

代码语言:javascript
复制
program.helpInformation = function () {
  return '';
};

program.on('--help', function () {
  console.log('我是帮助信息');
});

再执行 -h 就不会出现之前的内容了,而是调用我们自定义的方法。

高级定制 实现 debug 模式

注意:在解析参数之后执行,脚手架初始化之前打印 verbose 还是不可以。可以使用这个方法代替之前自己封装的开启 debug 模式的代码。

代码语言:javascript
复制
program.on('option:debug', () => {
  console.log('开启debug模式');
  if (program._optionValues.debug) {
    process.env.LOG_LEVEL = 'verbose';
  }
  console.log(process.env.LOG_LEVEL);
});

高级定制 对所有未知命令监听

当输入未知命令时,执行自定义的回调。

代码语言:javascript
复制
program.on('command:*', (obj) => {
  const commands = program.commands.map((command) => command.name());
  console.log(`可用命令为${commands.join(',')}`);
});
下一篇
举报
领券