一、前言
在实际项目开发时,从0开始搭建项目是一件很繁琐的事情,尤其是在对一个框架使用不熟悉的时候。我们希望可以直接使用模板来初始化项目,进而提高团队的开发效率。
我们知道很多框架都自带脚手架工具,通过脚手架来快速创建一个项目,这样在搭建项目时不用再从头开始初始化,而是在命令行输入 初始化命令 即可。
cli命令行界面( command line interface ),在用户提示符下 键入 可执行命令的界面(用户通过键盘输入指令,计算机接受到指令后,予以执行。)
比如以下几个脚手架,基于不同的cli工具,用以初始化不同项目:
- umi
通过create-umi提供脚手架能力,直接通过yarn create umi命令来创建一个umi项目; - dva
安装dva-cli,通过dva new projectName命令创建一个基于dva框架的应用; - vue
安装vue-cli,使用vue init webpack projectName命令初始化一个vue项目,其中,vue init 就是使用vue-cli来初始化项目,并且webpack作为构建工具; - d2-admin
安装d2-admin-cli,d2-admin-cli是基于d2-admin的脚手架系统,可以快速生成D2 Admin项目;
使用 d2 create projectName 或者 d2 c projectName 命令初始化项目;
And?怎样开发出适合/符合自己业务的、可初始化项目、用以生成代码模板等需求的命令行工具呢?我们也知道很多模板的封装都是基于cli的,而命令行辅助模块commander就可以简化cli实现命令的流程,帮助命令行工具的开发。
二、commander.js常见API及举栗
1.option
作用:用于定义命令选项
用法示例:.option(’-n, --name
参数解析:
(1)自定义标记:是必选的,分为长短标识,中间用空格、逗号或竖线分割,标记后面可跟必选/可选参数,必选参数用尖括号<>包含着;可选参数用方括号[]包含着;
(2)选项描述:可省略的,在使用 --help命令时后面显示的标志描述;
(3)默认值:也可省略的
// bin/test.js文件
// 引入commander依赖
var program = require('commander');
program
.option('-t, --tiger', 'watch tiger')
.option('-l, --lion', 'watch lion')
.option('-p, --big-panda', 'watch big big panda')
.option('-k, --koala', 'watch koala')
.option('-z, --zoo [type]', 'Go to the zoo and choose the animal [marble]', 'marble')
.parse(process.argv)
// ...
if(program.parse) {
console.log('打印process.argv:', process.argv)
}
// 测试option
console.log('The animal you choose is:');
if (program.tiger) console.log(' - tiger');
if (program.lion) console.log(' - lion');
if (program.bigPanda) console.log(' - big-panda');
if (program.koala) console.log(' - koala');
console.log(`The zoo name is:${program.zoo} zoo`);
结果:
2.version
作用:用来定义命令程序的版本号
用法示例:.version(‘0.0.1’, ‘-V, --version’)
参数解析:
(1)版本号:是必选的;
(2)自定义标志:可选的,默认为 --version 和-V
// 引入commander依赖
var program = require('commander');
program
.version('0.1.1')
.parse(process.argv);
程序默认执行的是‘-V’和‘–version’,执行其他选项,如‘-v’会提示unknown
如果想要响应其他命令选项,可以使用自定义标志传递给version(),比如:
.version('0.1.1', '-v, --version')
3.command
作用:添加命令名称
用法示例:.command(‘commandName <必须参数>[可选参数]’, ‘install decription’, opts)
参数解析:
(1)命令名称:必选的,命令后面可跟用 <> 或 [] 包含的参数;命令的最后一个参数是可变的,但是必须将…附加到参数名称;在命令后面传入的参数会被传入到 action 的回调函数以及 program.args 数组中;
(2)命令描述:可省略的,如果存在,且没有显示调用action(fn),就会启动子命令程序,否则会报错;
(3)配置选项:可省略的,可配置noHelp、isDefault等
tips:可以使用 .command 为你的最高层命令指定子命令。 这里我们有两种方法可以实现:为命令绑定一个操作处理程序(action handler),或者将命令单独写成一个可执行文件.
var program = require('commander');
program
.version('0.1.2')
.command('testCom <filesDir> [otherParams...]')
.action(function (filesDir, otherParams) {
console.log('testCom %s', filesDir);
if (otherParams) {
otherParams.forEach(function (oDir) {
console.log('testCom %s', oDir);
});
}
});
program.parse(process.argv);
结果:
4.description
作用:用来描述命令
用法示例:.description(‘rmdir desc’)
5.alias
作用:自定义别名
用法示例:.alias(‘ex’)
var program = require('commander');
program
.command('test <filesDir> [otherParams...]')
.alias('t')
.usage('[options] <file ...>')
.description('run test commands for all envs')
program.parse(process.argv);
6.action
作用:用来定义命令的回调函数
用法示例:.action(fn)
program
.command('topt [testOptParams]')
.description('run topt commands for all testOptParamss')
.option("-s, --topt_mode [mode]", "Which topt mode to use")
.action(function(testOptParams, options){
var mode = options.topt_mode || "normal";
testOptParams = testOptParams || 'all';
console.log(`test optional params for ${testOptParams} testOptParams(s) with ${mode} mode`);
});
program.parse(process.argv);
7.parse
作用:用于解析process.argv,设置options以及触发commands(一般是最后强调)
用法示例:.parse(process.argv)
tips:
- process对象
process对象是一个全局变量,它提供了当前node.js的有关信息,以及用以控制node.js进程。 - process.argv
process.argv返回一个数组,这个数组包含了启动node.js进程的命令参数;其中,process.argv[0]返回的是启动node.js进程的可执行文件的绝对路径;process.argv[1]返回的是当前执行的JS文件的路径;其余的元素就是命令参数。
// 引入commander依赖
var program = require('commander');
var colors = require('colors');
program
.on('--help', function(){
console.log('console test~~~');
});
program.parse(process.argv); // parse()用于解析process.argv,设置options以及触发commands
if (process.argv.slice(2).length) {
console.log('有命令')
}else {
console.log('没有命令')
program.outputHelp(colorText); // 将打印的帮助信息改为其他颜色
}
function colorText(text) {
return colors.yellow(text); // 将字体改为黄色
}
if(program.parse) {
console.log('process.argv:', process.argv)
}
8.outputHelp
作用:一般用于没有录入参数时,自动打印的帮助信息,也就是说,在未提供command时,默认情况下是会显示帮助的打印信息
用法示例:.outputHelp()
// bin/test.js文件
// 引入commander依赖
var program = require('commander');
var colors = require('colors');
// 定义版本version和参数选项option
program
.version('0.0.1', '-v, --version')
.option('-i, --init', 'init something')
.option('-a, --add', 'add something')
.option('-l, --list', 'view something')
.option('-d, --delete', 'delete something')
.option('-g, --generate', 'generate something')
.option('-r, --remove', 'remove something')
.command('getPictrue [url]', 'get getPictrue URL~')
// 必须在.parse()之前,因为node的emit()是即时的
program.on('--help', function(){
console.log('console test~~~');
});
program.parse(process.argv); // parse()用于解析process.argv,设置options以及触发commands
// console.log('打印process.argv', process.argv);
例如执行以下两条命令的结果都是一样的:
node bin\test --help
node bin\test
结果:(是一样的)
以上是commanderJs的一些常用API及其举栗/实例,commander库它就是一个简单的封装,用以定义多文件的命令、简易文档和执行参数等。后续会继续练习补充…