Commander入门

Commander框架简介

Commander.js是一个Node.js的轻量级命令行框架,用于创建命令行应用程序。Commander.js提供了对应用程序命令行告知用户的友好界面,并应用了普遍认同的GNU和Unix标准选项。

Commander官方文档
脚手架的介绍及开发流程

基本用法

1.引入commander.program,设置用法提示和版本号

使用usage()定义用法提示,根据需要使用name()定义用法提示的前缀,最后使用version()定义版本号。

const commander = require("commander");
// 获取commander的单例
const { program } = commander;
// 非单例的写法,一般用于注册子命令
// const program = commander.Command()
program
// 用法提示
.usage(" [options]")
// 用法提示的前缀 ==> imooc-test  [options]
.name(Object.keys(pkg.bin)[0])
// 版本号
.version(pkg.version);

定义全局选项

使用option()定义全局选项,可以定义多个全局选项。第一个参数为选项的名称和别名,需要使用空格来分割。第二个参数为该选项的描述信息。第三个参数为选项默认值。

program
  .option("-d, --debug", "是否开启调试模式", false)
  // -e/--env后跟的字符,将存到envName属性中
  .option("-e, --envName ", "获取环境变量名称", 'production');

获取选项键值对

使用opts()获取解析命令行参数后的选项键值对,属性名为选项的长标识

const opts = program.opts();
console.log(opts) // => {debug: false, envName: 'production'}

定义命令

  • 方式一:使用command()注册命令,<> 表示该参数是必须的。
    • description()定义该命令的描述信息。
    • alias()定义该命令的别名。
    • option()定义该命令的选项,用法与全局选项一致。
    • action()定义该命令要做的事情。
const clone = program.command("clone ");
clone
  // 命令描述
  .description("command clone")
  // 别名
  .alias("c")
  // 命令的选项
  .option("-f --force", "是否强制克隆", false)
  // 要做的事
  .action((source, cmdObj) => {
  // cmdObj-命令行键值对
  // mock-项目是否已克隆
  const cloned = true;
  if (cloned) {
    // 强制覆盖
    if (cmdObj.force) {
      console.log("项目已克隆,将强制覆盖");
      handleClone(source)
    } else {
      console.log("克隆失败!该项目已克隆");
    }
  } else {
    handleClone(source)
  }
});
function handleClone(source) {
  console.log("cloning...");
  console.log(`cloneSource is ${source}`);
  console.log("opts:", program.opts());
}
  • 方式二:使用addCommand()注册子命令
    先定义一个Command对象,然后定义该对象的子命令。最后使用program.addCommand() 将该命令加入到主命令中
const service = new commander.Command("service");
service
.command("start [port]")
.description("start a new service at some port")
.action((port) => {
console.log("do service start", port);
});
service
.command("stop")
.description("stop service")
.action(() => {
console.log("stop service");
});
program.addCommand(service);

arguments定义未注册的命令

program.arguments()方法用于解析命令行中的参数,若命令行中存在没有被program.command()或Command.command()注册的命令或选项,这些参数会被自动传递到这个默认的回调函数中。

program
// 注册arguments
.arguments(" [options]")
// arguments的描述信息
.description("test command")
.action((cmd, options) => {
console.log("cmd:", cmd);
console.log("options:", options);
});

解析命令行参数

使用process.argv可以获取命令行参数,再使用program.parse()解析命令行参数(需要放到代码的最后一行)。

program.parse(process.argv);

完整代码

#!/usr/bin/env node

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

// 获取commander的单例
const { program } = commander;
// 非单例的写法:const program = commander.Command()

program
  // 用法提示
  .usage(" [options]")
  // 用法提示的前缀 ==> imooc-test  [options]
  .name(Object.keys(pkg.bin)[0])
  // 版本号
  .version(pkg.version);

/*
 * option-定义选项
 * flags: string
 * description?: string | undefined
 * defaultValue?: string | boolean | string[] | undefined
 */
// 这里是注册全局选项
program
  .option("-d, --debug", "是否开启调试模式", false)
  // -e/--env后跟的字符,将存到envName属性中
  .option("-e, --envName ", "获取环境变量名称");

/*
 * 注册命令
 * 有command和addCommand两种方式
 */
// 方式一:command
// 注册clone命令,返回一个配置对象,<>-必选 []-可选
const clone = program.command("clone ");
clone
  // 命令描述
  .description("command clone")
  // 别名
  .alias("c")
  // 命令的选项
  .option("-f --force", "是否强制克隆", false)
  // 要做的事
  .action((source, cmdObj) => {
    // cmdObj-命令行键值对
    // 项目是否已克隆
    const cloned = true;
    if (cloned) {
      // 强制覆盖
      if (cmdObj.force) {
        console.log("项目已克隆,将强制覆盖");
        handleClone(source);
      } else {
        console.log("克隆失败!该项目已克隆");
      }
    } else {
      handleClone(source);
    }
  });
function handleClone(source) {
  console.log("cloning...");
  console.log(`cloneSource is ${source}`);
  console.log("opts:", program.opts());
}

// 方式二:addCommand,注册子命令
const service = new commander.Command("service");
service
  .command("start [port]")
  .description("start a new service at some port")
  .action((port) => {
    console.log("do service start", port);
  });
service
  .command("stop")
  .description("stop service")
  .action(() => {
    console.log("stop service");
  });
program.addCommand(service);

/*
 * arguments-没有注册的命令,都会走到这
 */
program
  .arguments(" [options]")
  .description("test command")
  .action((cmd, options) => {
    console.log("cmd:", cmd);
    console.log("options:", options);
  });

// 提示帮助信息
// program.outputHelp()
// 获取选项键值对
// const optionsMap = program.opts();
// console.log(optionsMap); ==> { version: boolean, envName: string }
// 解析命令行参数
program.parse(process.argv);

效果演示

Commander入门_第1张图片

你可能感兴趣的:(javascript,开发语言,ecmascript)