commander入门级实践

174 阅读2分钟

快速实现一个commander脚手架

通过commander库实现;

lerna add commander@6.2.1 

cli-test项目中学习commander库;在mj-cli-test/bin/index.js文件中修改;

#!/usr/bin/env node

const commander = require("commander");
const pkg = require("../package.json");

// 能获取到program,说明脚手架已经注册好了
const { program } = commander;

program.version(pkg.version).parse(process.argv);

这样就可以成功获取version

image.png

commander脚手架全局配置

#!/usr/bin/env node

const commander = require("commander");
const pkg = require("../package.json");

// 获取commander的单例
// 能获取到program,说明脚手架已经注册好了
// const { program } = commander;

// 手动实例化一个Command实例
const program = new commander.Command();

program
  .name(Object.keys(pkg.bin)[0])
  .usage("<command>[options]")
  .version(pkg.version)
  .option("-d, --debug", "是否开启调试模式", true)
  .option("-e, --envName <envName>", "获取环境变量名称")
  .parse(process.argv);

console.log(program.debug);
console.log(program.envName);
program.outputHelp(); // 打印帮助信息
console.log(program.opts()); // 打印所有的参数

commander脚手架命令注册的两种方法

// 1. commander api注册命令
// clone是返回的新对象,<source>是必传参数,[description]是非必传
const clone = program.command("clone <source> [description]");
clone
  .description(" clone a repository")
  .option("-f, --force", "是否强制拷贝")
  .action((source, description, cmdOjb) => {
    console.log("clone", source, description, cmdOjb.force);
  });

// 2. addCommand 注册命令
// 类似于命令分组
const service = new commander.Command("service");
service
  .command("start [port]")
  .description("start service by port")
  .action((port) => {
    console.log("do service start", port);
  });
service
  .command("stop")
  .description("stop service")
  .action(() => {
    console.log("stop service");
  });

program.addCommand(service);

commander注册命令的两种高级用法

// 可以匹配到所有的未注册的命令
program
  .arguments("<cmd> [options]")
  .description("test command", {
    cmd: "command to run",
    options: "options for command",
  })
  .action(function (cmd, options) {
    console.log(cmd, options);
  });

// 输入 mj-cli-test install test 会去找mj-cli-test-install这个命令
// alias别名
// command的第三个参数opt
// 使用executableFile时,输入mj-cli-test install test,它回去找mj-install
// 可以实现串行调用
// 设置isDefault,默认命中install这个命令
// hidden可以隐藏command
program
  .command("install [name]", "install package", {
    executableFile: "mj-install",
    isDefault: true,
    hidden: true,
  })
  .alias("i");

commander的三种高级用法

// 1.自定义help信息
program.helpInformation = function () {
  return "your help infomation";
};
program.on("--help", function () {
  console.log("your help infomation");
});
// 2.实现debug模式
program.on("option:debug", function () {
  if (program.debug) {
    process.env.LOG_LEVEL = "verbose";
  }
  console.log(process.env.LOG_LEVEL);
});
// 3.对未知命令监听
program.on("command:*", function (obj) {
  console.log("obj", obj);
  console.error("未知的命令:" + obj[0]);
  // console.log(program.commands); // 获取所有的命令
  const avaliableCommands = program.commands.map((cmd) => cmd.name());
  console.log("可用命令:", avaliableCommands);
});