yargs是否有一个钩子我可以在每个命令之前运行?

时间:2018-12-14 21:52:00

标签: yargs

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以使用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;