commander.js的简单研究(一)

一、前言

在实际项目开发时,从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 ’, ‘name description’, ‘default 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库它就是一个简单的封装,用以定义多文件的命令、简易文档和执行参数等。后续会继续练习补充…

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值