首页 > 解决方案 > yargs 是否有一个我可以在每个命令之前运行的钩子?

问题描述

我需要在每个命令运行之前运行一些代码,使用命令的名称。我在 yargs api 文档中找不到任何内容。

具体来说,我想删除我的每个命令创建的缓存。例如命令foo,在 中创建一个缓存./.tmp/foo。我只想在每次运行之前删除该缓存我可以从每个命令回调中删除它,但很好奇是否有更编程的方式来做到这一点。

yargs 是否有任何我可以用来完成此任务的功能?

标签: yargs

解决方案


您可以使用Middleware,它在命令执行之前提供解析参数的转换。

                        --------------         --------------        ---------
stdin ----> argv ----> | Middleware 1 | ----> | Middleware 2 | ---> | Command |
                        --------------         --------------        ---------

但是,您可以使用相同的方法来清理缓存。

示例中间件

const { promisify } = require('util') // since node 8.0.0
const readFile = promisify(require('fs').readFile)

const normalizeCredentials = (argv) => {
  if (!argv.username || !argv.password) {
    return readFile('~/.credentials').then(data => JSON.parse(data))
  }
  return {}
}

// Add normalizeCredentials to yargs
yargs.middleware(normalizeCredentials)

// yargs parsing configuration
var argv = require('yargs')
  .usage('Usage: $0 <command> [options]')
  .command('login', 'Authenticate user', (yargs) =>{
        return yargs.option('username')
                    .option('password')
      } ,(argv) => {
        authenticateUser(argv.username, argv.password)
      },
      [normalizeCredentials]
     )
  .argv;

推荐阅读