【nodejs脚手架开发】命令处理-commandar篇

2021-08-30 21:51:28 浏览数 (1)

【nodejs脚手架开发】命令处理-commandar篇

官方文档:https://github.com/tj/commander.js/blob/master/Readme_zh-CN.md

基本概念

对于脚手架工具我们每天都在用,所以我们并不陌生,下面是一条常见的npm命令,在commandar中,分别对应命令、选项、参数等几个概念。

常用API讲解

快速开始

代码语言:txt复制
npm install commander --save
代码语言:txt复制
const { program } = require('commander');

// 设置命令版本

program.version('0.0.1'); 

选项

Commander 使用.option()方法来定义选项,同时可以附加选项的简介。每个选项可以定义一个短选项名称(-后面接单个字符)和一个长选项名称(--后面接一个或多个单词),使用逗号、空格或|分隔。

普通选项
代码语言:txt复制
const { program } = require('commander');

/**

*

* @param {*} optionName 选项名称,长短选项以逗号隔开

* @param {*} decs 选项描述,将添加的help信息中

* @param {*} defaultValue 选项默认值 或 自定义参数处理方法

*/

program.option('-o, --open', '打开浏览器');

// 选项默认值

program.option('-c, --create <filename>', '新建文件', 'hello');

// 变长参数选项,其中的numbers可以输入多个

program.option('-n, --number <numbers...>', 'specify numbers')

变长参数使用示例

代码语言:txt复制
$ collect -n 1 2 3

这时number对应的值为数组1, 2, 3

必选选项

通过.requiredOption()方法可以设置选项为必填。必填选项要么设有默认值,要么必须在命令行中输入,对应的属性字段在解析时必定会有赋值。该方法其余参数与.option()一致。

代码语言:txt复制
const { program } = require('commander');

/**

*

* @param {*} optionName 选项名称,长短选项以逗号隔开

* @param {*} decs 选项描述,将添加的help信息中

* @param {*} defaultValue 选项默认值, 可选

*/

program.requiredOption('-o, --open', '打开浏览器')
自定义选项

选项的参数可以通过自定义函数来处理,该函数接收两个参数,即用户新输入的参数值和当前已有的参数值(即上一次调用自定义处理函数后的返回值),返回新的选项参数值。

自定义函数适用场景包括** 参数类型转换 参数暂存 **,或者其他自定义处理的场景。

代码语言:txt复制
function myParseInt(value, dummyPrevious) {

  // parseInt 参数为字符串和进制数

  const parsedValue = parseInt(value, 10);

  if (isNaN(parsedValue)) {

    throw new commander.InvalidArgumentError('Not a number.');

  }

  return parsedValue;

}


program.option('-i, --integer <number>', 'integer argument', myParseInt)

添加命令

通过.command().addCommand()可以配置命令,有两种实现方式:为命令绑定处理函数,或者将命令单独写成一个可执行文件

comand()

comand适用于无特殊处理或者简单处理的情况

代码语言:txt复制
// 通过绑定处理函数实现命令(这里的指令描述为放在`.command`中)

// 返回新生成的命令(即该子命令)以供继续配置

program

  .command('clone <source> [destination]')

  .description('clone a repository into a newly created directory')

  .action((source, destination) => {

    console.log('clone command called');

});
addComand()

addComand有利于代码模块化

代码语言:txt复制
function makeHeatCommand() {

  const heat = new commander.Command('heat');

  heat

    .command('jug')

    .action(() => {

      console.log('heat jug');

    });

  heat

    .command('pot')

    .action(() => {

      console.log('heat pot');

    });

  return heat;

}

program.addCommand(makeHeatCommand());

实战

下面是vue-cli中serve的功能描述,我们通过简单的代码模拟实现

目录结构

my-cli.js
代码语言:txt复制
const program = require('commander')  // npm i commander -D


program.version('0.0.1')

    .usage('serve [options] [entry]')

    .command('serve', 'serve') // 会自动匹配my-cli-serve.js文件为处理文件

    .parse(process.argv)
my-cli-serve.js
代码语言:txt复制
const program = require('commander');


program.usage('serve [options] [entry]')

  .option('-o, --open', '打开浏览器')

  .option('-c, --copy', '将本地 URL 复制到剪切板')

  .parse(process.argv)


const options = program.opts();

// 处理选项

if (options.open) console.log('打开浏览器');

if (options.copy) console.log('将本地 URL 复制到剪切板');
执行结果

0 人点赞