阅读 160

commanderJs与InquirerJs学习笔记

commander

完整的 node.js 命令行解决方案。

首先安装npm install commander,新建bin/index.js,在第一行添加#!/usr/bin/env node,在package.json中添加

"bin": {     "clipre": "bin/index.js"   }, 复制代码

随后在根目录运行npm link,即可以通过在命令行运行clipre等各种命令。

选项

首先要接受命令行传入的各种命令,可以使用.option()

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

解析后的选项可以通过Command对象上的.opts()方法获取,同时会被传递给命令处理函数。可以使用.getOptionValue().setOptionValue()操作单个选项的值。

bin/index.js:

#!/usr/bin/env node const { program } = require('commander'); program.version('0.0.1'); program   .option('-d, --debug', 'output extra debugging')   .option('-s, --small', 'small pizza size')   .option('-p, --pizza-type <type>', 'flavour of pizza'); program.parse(process.argv); const options = program.opts(); if (options.debug) console.log(options); console.log('pizza details:'); if (options.small) console.log('- small pizza size'); if (options.pizzaType) console.log(`- ${options.pizzaType}`); 复制代码

在命令行输入clipre -d -s -p vegetarian,打印结果为

{ debug: true, small: true, pizzaType: 'vegetarian' } pizza details: - small pizza size - vegetarian 复制代码

同时还可以设置默认值:

.option('-a, --cheese <type>', 'add the specified type of cheese', 'blue'); 复制代码

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

.requiredOption('-c, --cheese <type>', 'pizza must have cheese'); 复制代码

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

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

可以在自定义函数的后面设置选项参数的默认值或初始值

function myParseInt(value, dummyPrevious) {   // parseInt 参数为字符串和进制数   const parsedValue = parseInt(value, 10);   if (isNaN(parsedValue)) {     throw new commander.InvalidArgumentError('Not a number.');   }   return parsedValue; } function increaseVerbosity(dummyValue, previous) {   return previous + 1; } function collect(value, previous) {   return previous.concat([value]); } function commaSeparatedList(value, dummyPrevious) {   return value.split(','); } program   .option('-f, --float <number>', 'float argument', parseFloat)   .option('-i, --integer <number>', 'integer argument', myParseInt)   .option('-v, --verbose', 'verbosity that can be increased', increaseVerbosity, 0)   .option('-c, --collect <value>', 'repeatable value', collect, [])   .option('-l, --list <items>', 'comma separated list', commaSeparatedList) ; program.parse(); const options = program.opts(); if (options.float !== undefined) console.log(`float: ${options.float}`); if (options.integer !== undefined) console.log(`integer: ${options.integer}`); if (options.verbose > 0) console.log(`verbosity: ${options.verbose}`); if (options.collect.length > 0) console.log(options.collect); if (options.list !== undefined) console.log(options.list); 复制代码

命令

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

.command()的第一个参数为命令名称。命令参数可以跟在名称后面,也可以用.argument()单独指定。参数可为必选的(尖括号表示)、可选的(方括号表示)或变长参数(点号表示,如果使用,只能是最后一个参数)。

#!/usr/bin/env node const { program } = require('commander'); program   .version('0.1.0')   .argument('<username>', 'user to login')   .argument('[password]', 'password for user, if required', 'no password given')   .action((username, password) => {     console.log('username:', username);     console.log('password:', password);   });      program.parse(); //命令行输入 clipre nick 123 //打印结果 username: nick password: 123 复制代码

在参数名后加上...来声明可变参数,且只有最后一个参数支持这种用法。可变参数会以数组的形式传递给处理函数

program   .version('0.1.0')   .command('rmdir')   .argument('<dirs...>')   .action(function (dirs) {     dirs.forEach((dir) => {       console.log('rmdir %s', dir);     });   }); //命令行输入 clipre rmdir nickasd 12 //打印结果 rmdir nickasd rmdir 12 复制代码

帮助信息

帮助信息是 Commander 基于你的程序自动生成的,默认的帮助选项是-h,--help

Usage: index [options] Options: -h, --help  display help for command 复制代码

如果你的命令中包含了子命令,会默认添加help命令,同时也可以使用addHelpText()添加额外信息。

program   .option('-f, --foo', 'enable some foo'); program.addHelpText('after', ` Example call:   $ custom-help --help`); //命令行输入 clipre -h //打印结果 Usage: index [options] Options:   -f, --foo   enable some foo   -h, --help  display help for command Example call:   $ custom-help --help 复制代码

inpuier

一组常见的交互式命令行用户界面

安装npm install inquirer,常用的方法有:

  • prompt 启动命令界面,参数有

    返回一个promise。

    • questions,是一个数组,包含问题对象,也可以传递一个 Rx.Observable 实例

    • answers, 包含已回答问题的值。询问者将避免询问这里已经提供的答案。默认值 {}

  • registerPrompt,注册插件,参数有

    • name,插件名字

    • prompt -提示对象

  • createPromptModule, 创建一个自包含的查询器模块。如果您不想在覆盖或添加新提示类型时影响其他也依赖查询器的库

这是一个挑选披萨的例子

const inquirer = require('inquirer'); inquirer   .prompt([     {       type: 'checkbox',       message: 'Select toppings',       name: 'toppings',       choices: [         new inquirer.Separator(' = The Meats = '),         {           name: 'Pepperoni',         },         {           name: 'Ham',         },         {           name: 'Ground Meat',         },         {           name: 'Bacon',         },         new inquirer.Separator(' = The Cheeses = '),         {           name: 'Mozzarella',           checked: true,         },         {           name: 'Cheddar',         },         {           name: 'Parmesan',         },         new inquirer.Separator(' = The usual ='),         {           name: 'Mushroom',         },         {           name: 'Tomato',         },         new inquirer.Separator(' = The extras = '),         {           name: 'Pineapple',         },         {           name: 'Olives',           disabled: 'out of stock',         },         {           name: 'Extra cheese',         },       ],       validate(answer) {         if (answer.length < 1) {           return 'You must choose at least one topping.';         }         return true;       },     },   ])   .then((answers) => {     console.log(JSON.stringify(answers, null, '  '));   }); 复制代码

在命令行运行clipre,即可以问题选项,最后将answers转化为字符串打印出来。

启动命令界面的prompt()方法接受一个questions数组,包含问题对象,问题对象常用的属性有:

  • type,常用的类型有 input, number, confirm, list, rawlist, expand, checkbox, password, editor

  • name,名称

  • message, 要打印的问题。如果定义为函数,第一个参数将是当前查询器会话的答案。默认为 name 的值

  • choices , 选择数组或返回选择数组的函数。如果定义为函数,第一个参数将是当前查询器会话的答案。数组值可以是简单的数字、字符串或包含名称(以显示在列表中)、值(以保存在答案散列中)和简短(以在选择后显示)属性的对象。选择数组还可以包含一个分隔符

  • validate,校验函数。


作者:只与明月听
链接:https://juejin.cn/post/7038915278968717325

 伪原创工具 SEO网站优化  https://www.237it.com/ 


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐