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

2022-12-10 13:24:51 浏览数 (1)


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(',')}`);
});

0 人点赞