前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【nodejs脚手架开发】命令处理-commandar篇

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

原创
作者头像
hasaki
修改2021-08-30 21:51:28
1.3K3
修改2021-08-30 21:51:28
举报
文章被收录于专栏:脚手架开发脚手架开发

【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 复制到剪切板');
执行结果

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【nodejs脚手架开发】命令处理-commandar篇
    • 基本概念
      • 常用API讲解
        • 快速开始
        • 选项
        • 添加命令
      • 实战
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档