commander.js续集之action、help、以及其他小知识

接上篇文章链接: commander.js之option、command、version
本文主要是将commander.js的用法和对应的api暴露出来用于学习,在本文最后会有一个小的事例,仅供参考

action

在上篇文章中说了option、command、以及version等api,action这个api是对咱们的命令进行做js处理。让我们来看一下:

// 以 上篇文章的 command 为例子 我们进行一些变化添加:
program
	.command(clone <source> [destination])
	.description('clone a repository into a newly created directory')
	.action((source, destination, options, command) => {
	// source, destination 这个都是命令里面带有的,
	// options 是对应的选项
		console.log('clone command called');
	})
// async ... await
async function run() { /* 在这里编写代码 */ }

async function main() {
  program
    .command('run')
    .action(run);
  await program.parseAsync(process.argv);
}

上面 的例子就是一个clone的命令,该命令必须跟着一个参数source(不知道原因的,请查看上篇文章commander.js之option、command、version 中的command的注意项)。在action处理函数中,接受对应的参数,并作出对应的处理。
注意:

  1. action 函数里面接收的参数,命令(command)中带有的参数,换句话说:就是该命令声明的所有参数。除此之外,该函数还提供两个参数,一个是解析出的选项(option),另一个则是该命令对象自身(command)。
  2. action 函数里面可以使用this,但是函数不能使用 箭头函数 只能使用 function 声明的无名函数。其中,this指向的是program
  3. action处理函数还可以使用 async …await
  4. 错误的处理,.allowUnknownOption() 处理option未知的时候,不让其进行打印错误信息。参数过多,默认是不进行报错的,如果想要其报错,请使用.allowExcessArguments(false)
  5. 独立可执行的命令(子命令)。当.command()带有描述参数时,就意味着使用独立的可执行文件作为子命令。executableFile 配置选项指定自定义名称(和路径).executableDir() 为子命令指定自定义搜索目录
    生命周期上设置回调函数

help

// 下面是在命令台进行输入的
commander help
commander --help

commander help yarn
commander yarn --help

// 下面是对help的一些描述
program
  .option('-f, --foo', 'enable some foo');
program.addHelpText('after', `Example call: $ custom-help --help`);

// 出错时,展示的默认数据以及自定义数据
program.showHelpAfterError();
// 或者
program.showHelpAfterError('(add --help for additional information)');

注意:

  1. -h, --help 是 commander内置的,不需要咱们自己去写命令。并且如果有子命令,是默认给子命令天假help的
  2. 自定义帮助信息,有两个参数: 参数一: 只能是,beforeAll,before,after, afterAll。参数二:字符串或者是带有返回值为字符串的函数
  3. 当输入命令的时候,出现错误,默认提示输入正确的命令,也可以自定义关闭program.showSuggestionAfterError(false);

prase与praseAsync

// prase 与 praseAsync 
program.parse(process.argv); // 指明,按 node 约定
program.parse(); // 默认,自动识别 electron
program.parse(['-f', 'filename'], { from: 'user' });

注意:

  1. prase与praseAsync 第一个参数要解析的是字符串数组。node环境可以默认process.agrv
  2. node环境想要自定义的话,如上面的第三行代码,from是必须的字段,不能更改。并且,from的参数只有三种: ‘node’, ‘electron’, ‘user’

其他小知识

注意:

  1. 自定义事件监听
program.on('option:verbose', function () {
  process.env.VERBOSE = this.opts().verbose;
});
  1. TypeScript,必须使用ts-node进行解析ts
node -r ts-node/register pm.ts

以上就是commander的基本使用,下面是一个简单的例子:

#! /usr/bin/env node

const { program } = require('commander')
const chalk = require('chalk')

// 判断后面是否跟着对应的命令
// 9.4.0 的 commander 不再使用该命令
const cleanArgs = (cmd) => {
  const args = {}
  cmd.options.forEach(o => {
    const key = o.long.slice(2);
    if (cmd[key]) args[key] = cmd[key]
  })
  return args
}

//  每个命令就是一个模块
program
    .command('create <app-name>')
    .description('create a new project')
    .option('-f, --force', 'overwrite target directory if it exits')
    .action((name, cmd) => {
      console.log(name,cmd)
    })

program
    .command('config [value]')
    .description('inspect and modify the config')
    .allowUnknownOption()
    .option('-g, --get <path>', 'get value from option')
    .option('-s, --set <path> <value>')
    .option('-d, --delete <path>', 'delete option from config')
    .action((name, cmd) => {
      // name 就是config [] 中的value
      console.log(name, cmd)
    })

program.on('--help', () => {
  console.log();
  console.log(`Run ${chalk.cyan(`shenlei <command> --help`)} for detailed usage of given command.`)
  console.log()
})

program.parse(process.argv)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值