【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()
一致。
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 复制到剪切板');