commander--命令行指令配置 (推荐-中文)

255 阅读3分钟

commander —— 命令行指令配置 (推荐-中文)

const program = require("commander");
// 解析用户执行时输入的参数
// process.argv 是 nodejs 提供的属性
// npm run server --port 3000
// 后面的 --port 3000 就是用户输入的参数
program.parse(process.argv);

添加获取版本号命令

program.version('1.0.0');

帮助文档提示信息

program.usage("nihoa"); // 在每个命令前可以添加

// 添加全局
program.addHelpText("beforeAll", "请阅读下面的命令!!!");
// beforeAll:作为全局标头栏展示
// before:在内建帮助信息之前展示
// after:在内建帮助信息之后展示
// afterAll:作为全局末尾栏展示
// 参数2 函数,返回一个字符串, 
// error:boolean 值,代表该帮助信息是否由于不当使用而展示
// command:代表展示该帮助信息的Command对象

在出错后展示帮助信息

// 所有错误
program.showHelpAfterError('出错了哦');

// 遇到未知命令和拼写错误后,建议正确拼写
program.showSuggestionAfterError(true);

添加自己的 option 官网文档

program.option('-c, clear', '删除 node_modules ',"函数","没有函数:默认参数 有函数:函数的参数")

// 最后一个 默认参数的, 直接 liu 也会有参数,但是 -c 没有参数不行

// 特殊指令可以自定义 Option
const { Option } = program;
program
  .addOption(new Option('-t, --timeout <delay>', 'timeout in seconds').default(60, 'one minute'))
// 参数只可以取一个 ,在 timerout 上
// .default() 默认参数 ,
// .env("PORT") 环境变量 使用: PORT=80 liu
// ....

处理 option 指令

// 在这个下面
program.parse(process.argv);
// 获取到参数
const opt = program.opts();

// 一个一个的判断,然后处理对应的指令
if (opt.clear) {
  //  -c 的命令 , 可以 全部指令放到 obj 上  obj[opt.clear]()
  console.log(opt.clear, "clear");
}
// ...
else {
  console.log("其他命令");
}

监听事件

// 监听事件
program.on('--help', function () {
  console.log('监听到了');
})
// 监听所有的 未知 命令, 会把命令放入到 参数里
program.on('command:*', function (obj) {
    console.log('监听到了',obj);
    console.error('未知的命令:', obj[0])
    const commands = program.commands.map(cmd=>cmd.name())
    console.log('可用命令:',commands.join(', '))
})

自定义指令

// 参数 create 指令名字
// <fileName>  必选参数
// [others]  可选参数
// [others...]  <fileName...> 多个可选参数
// 配置对象: noHelp: 不显示在 帮助文档
//   	     isDefault: 没有其他命令,默认执行这个命令
//           executableFile: 可以手动修改可执行文件 可以使用别的脚手架
//           例:.command("install ", { executableFile: '../cli' }) 要拼接路径到其他的脚手架命令(或者其他js文件,也会调用) 就可以执行别的脚手架命令 也可以相对路径
program
  .command("create <fileName> [others...]", { noHelp: true })
  .description("这里是描述!!")
  .option("-p,--port <port_number>", "web port")
  .action(async (fileName, others, option) => {
    console.log("开始执行了");
    console.log(fileName, others, option?.port);
    try {
      // direct: 要克隆的地址 , 下载到的文件路径,  不填就是下载, clone 可以初始化 git 的操作
      await download("direct:下载路径", "保存到文件的路径", { clone: true });
    } catch (error) {
      console.log("出错误:", err);
    }
  });
// .description 描述信息
// .alias('i') 添加别名
// .option 可以为指令添加参数 如: liu create -p 8080
// .action 处理指令参数, 传入一个函数,函数接收 的是指令传入的参数,最后一个参数 指向该命令自身
// .argument('<first>', 'integer argument', 1000) 可以匹配所有命令,可以单独把参数提出来配置 	.argument('[second]', 'integer argument', 1000, 2000) 在description 第二参数可以用 {first:'第一个'} 来描述 命令
// .name('create')  单独把 name 提出来配置


添加子命令

const service = new commander.Command('service');
service.command('start [port]')
.description('在 service 下创建的子命令')
.action((port)=>{
    console.log('执行命令',port)
})

// 注册到全局
program.addCommand(service)
// cli service -h  // 显示的就只有 service 创建的命令
// cli service start 8888 --> '执行命令',8888