• 二、yargs用法


    .command(cmd, desc, [builder], [handler])
    .command(cmd, desc, [module])
    .command(module)

    定义应用暴露出来的命令
    参数:cmd ,必须是一个字符串类型命令名称,或者是一个数组,数组的类型是字符串,代表是命令的名称或者命令的别名
    参数: desc,用来描述命令是作什么用的, 如果设置 desc 的值为 false,则会创建一个隐藏的指令
    可选参数: builder,这个是用来提示命令需要接收的参数

    yargs
      .command('get', 'make a get HTTP request', {
        url: {
          alias: 'u',
          default: 'http://yargs.js.org/'
        }
      })
      .help()
      .argv
    
      可选参数:builder,也可以是一个方法,这个方法的参数是yargs的实例 
      yargs
      .command('get', 'make a get HTTP request', function (yargs) {
        return yargs.option('url', {
          alias: 'u',
          default: 'http://yargs.js.org/'
        })
      })
      .help()
      .argv
    
    //  还可以传另一个处理函数,这个函数会被调用并且传入处理过的argv
    yargs
      .command(
        'get',
        'make a get HTTP request',
        function (yargs) {
          return yargs.option('u', {
            alias: 'url',
            describe: 'the URL to make an HTTP request to'
          })
        },
        function (argv) {
          console.log(argv.url)
        }
      )
      .help()
      .argv

    .completion([cmd], [description], [fn]);

    这个用于命令行被全
    cmd定义参与命令补全的命令。第一次使用会有提示,如果用的zsh,那么将提示中 .bashrc改成.zshrc,然后按照提示操作(切记将你的js文件设置(chmod u+x)为可执行文件,然后不规则操作)
    description 描述命令的使用方法
    fn 提供待补全的参数

    如果实现的时候没有携带参数,那么.completion()会让补全命令输出补全脚本

    var argv = require('yargs')
      .completion('completion', function(current, argv) {
        // 'current' is the current command being completed.
        // 'argv' is the parsed arguments so far.
        // simply return an array of completions.
        return [
          'foo',
          'bar'
        ];
      })
      .argv;
    
      //还可以实现异步方法被全
      var argv = require('yargs')
      .completion('completion', function(current, argv, done) {
        setTimeout(function() {
          done([
            'apple',
            'banana'
          ]);
        }, 500);
      })
      .argv;
    
      //还可以返回一个promise对象进行补全
      var argv = require('yargs')
      .completion('completion', function(current, argv) {
        return new Promise(function (resolve, reject) {
          setTimeout(function () {
            resolve(['apple', 'banana'])
          }, 10)
        })
      })
      .argv;

    .config([key], [desction], [parseFn])
    这个方法传入key,相当于是一个 JSON 配置文件的路径。文件中的 JSON 属性被设置为对应的 key 和 value(挂在 argv 上)。文件使用 nodejs 的 require api 加载的,文件名最好为.js, .json。
    如果此方法没有携带任何参数,.config()将会使用--config选项传入 JSON 配置文件(此时只能传入以.json 结尾文件)
    description同其他方法,用于描述命令
    可选项 parseFn 可以用来定制转换器。转换函数必须是同步的,并且应当返回一个带有 key,value 键值对的对象或者一个 error。

    .config(object)
    还可以传一个明确的object, 同样的,它的键值对会转化为argv的键值对。
    var argv = require("yargs").config({ foo: 1, bar: 2 }).argv;

    config和pkgConf可以提供extends关键词,用来表明配置应该从别处继承。
    extends参数可以是绝对路径也可以是相对路径

    yargs.config({
      extends: "./configs/a.json",
      logLevel: "verbose"
    }).argv;

    //或者也可以提供一个模块(这对函数性很有用,就像babel-presets)
    yargs.pkgConf('nyc');

     

    自定义的package.json
    {
    "nyc": {
        "extends": "nyc-babel-config"
      }
    }
    nyc-babel-config是一个包,这个包导出了configuration在index文件中

    .conflicts(x, y);
    设置了x之后y就不能设置了。y可以是一个字符串,也可以是一组 key不与x共存的

    .count(key)
    此命令用来对命令计数,并转化为命令的参数,例如:

    #!/usr/bin/env node
    var argv = require("yargs")
      .count("verbose")
      .alias("v", "verbose").argv;
    
    VERBOSE_LEVEL = argv.verbose;
    
    function WARN() {
      VERBOSE_LEVEL >= 0 && console.log.apply(console, arguments);
    }
    function INFO() {
      VERBOSE_LEVEL >= 1 && console.log.apply(console, arguments);
    }
    function DEBUG() {
      VERBOSE_LEVEL >= 2 && console.log.apply(console, arguments);
    }
    
    WARN("Showing only important stuff");
    INFO("Showing semi-important stuff too");
    DEBUG("Extra chatty mode");

    .demandOption(key, [msg | boolean]) .demandOption(key, msg)
    此命令用来强制用户输入某些参数
    如果 key 是一个字符串,且 key 没有出现在命令行参数中,展示使用说明并退出。
    如果 key 是数组,限制每一个数组中的参数
    如果提供了 msg,而且没有相应参数,那么 msg 将会展示,替代原有的标准错误信息

    require("yargs")
      .option("run", {
        alias: "r",
        describe: "run your program"
      })
      .option("path", {
        alias: "p",
        describe: "provide a path to file"
      })
      .option("spec", {
        alias: "s",
        describe: "program specifications"
      })
      .demandOption(
        ["run", "path"],
        "Please provide both run and path arguments to work with this tool"
      )
      .help().argv;
    
      //当第二个参数为布尔值的时候,布尔值决定了这个选项是不是必须的。当使用 options 方法的时候,这个选项很有用
    
    require("yargs")
      .options({
        run: {
          alias: "r",
          describe: "run your program",
          demandOption: true
        },
        path: {
          alias: "p",
          describe: "provide a path to file",
          demandOption: true
        },
        spec: {
          alias: "s",
          describe: "program specifications"
        }
      })
      .help().argv;

    .demandCommand([min=1], [minMsg]) .demandCommand([min=1], [max], [minMsg], [maxMsg])
    此命令用于限定用户在程序中使用的命令次数。如果命令没有传进来,使用 msg 提供标准的错误提示

    require("yargs")
      .command({
        command: "configure <key> [value]",
        aliases: ["config", "cfg"],
        desc: "Set a config variable",
        builder: yargs => yargs.default("value", "true"),
        handler: argv => s
          console.log(`setting ${argv.key} to ${argv.value}`);
        }
      })
      // provide a minimum demand and a minimum demand message
      .demandCommand(1, "You need at least one command before moving on")
      .help().argv;

    .hide(key)
    在使用信息中隐藏一个key, 除非用 --show-hidden

    var yargs = require("yargs")(['--help'])
      .showHidden('show-hidden', 'Show hidden options')
      .argv

    .detectLocale(boolean)
    yargs检测操作系统本地,默认是trues

    .env([prefix])
    定义环境变量的值,使用”_“来表明嵌套的选项(nested__foo => nested.foo)

    程序参数定义优先的次序:

    命令行参数
    env 参数
    配置文件或者 object
    默认选项

    //fruity.js
    var argv = require("yargs")
      .env("MY_PROGRAM")
      .option("f", {
        alias: "fruit-thing",
        default: "apple"
      }).argv;
    console.log(argv);
    
    $: node fruity.js
    { _: [],
      f: 'apple',
      'fruit-thing': 'apple',
      fruitThing: 'apple',
      '$0': 'fruity.js' }
    
      $ MY_PROGRAM_FRUIT_THING=banana node fruity.js
    { _: [],
      fruitThing: 'banana',
      f: 'banana',
      'fruit-thing': 'banana',
      '$0': 'fruity.js' }
    
      $ MY_PROGRAM_FRUIT_THING=banana node fruity.js -f cat
    { _: [],
      f: 'cat',
      'fruit-thing': 'cat',
      fruitThing: 'cat',
      '$0': 'fruity.js' }

    .epilog(str)
    .epilogue(str)
    使用说明结尾处的文案

    var argv = require('yargs')
      .epilogue('for more information, find our manual at http://example.com');

    .example(cmd, desc)
    增加示例,第一个参数cmd中,$0代表命令行中的第一个参数。例子会随着帮助信息打印出来。

    .exitProcess(enable)
    如果yargs由于调用 .version或者校验失败或者命令执行失败,调用exitProcess(false),可以继续执行其它正常的指令。

    .exit(code, err)
    主动退出程序,并且可以提示 上下文表示为什么我们要退出。

    .fail(fn)
    发生错误的时候会调用
    msg是本来要打印的错误
    err本来要抛出的错误
    yargs是yargs的实例

    var argv = require('yargs')
      .fail(function (msg, err, yargs) {
        if (err) throw err // preserve stack
        console.error('You broke it!')
        console.error(msg)
        console.error('You should be doing', yargs.help())
        process.exit(1)
      })
      .argv

    .getCompletion(args, done);
    允许程序按步取得补全内容
    args:命令行需要被补全的数组
    done: 回调函数,函数会获取当前的补全内容

    require('yargs')
      .option('foobar')
      .option('foobaz')
      .completion()
      .getCompletion(['./test.js', '--foo'], function (completions) {
        console.log(completions)
      })
      //如果输入 ./test.js --foo 输入TAB: --foobar 和 --foobaz

    .global(globals, [global=true])
    此命令指点某个选项不会被重置当命令执行的时候

    var argv = require('yargs')
      .option('a', {
        alias: 'all',
        default: true,
        global: false
      })
      .option('n', {
        alias: 'none',
        default: true,
        global: false
      })
      .command('foo', 'foo command', function (yargs) {
        return yargs.option('b', {
          alias: 'bar'
        })
      })
      .help('help')
      .global('a')
      .argv
    
      //如果foo执行 , all这个参数会被保留,但是node会被删除

    .group(key(s), groupName)
    把一个key或者一组keys放到一个 groupName下,当调用使用文档的时候会分组展示

    var yargs = require('yargs')(['--help'])
      .help()
      .group('batman', 'Heroes:')
      .describe('batman', "world's greatest detective")
      .wrap(null)
      .argv
    
    //结果:
    //  Heroes:
    //  --batman  world's greatest detective
    
    //Options:
    //  --help  Show help  [boolean]

    .help([option, [description]])
    设置帮助提示
    如果不传参数 , .help(); 这里启用 --help这个选项

    var yargs = require("yargs")(['--info'])
      .usage("$0 -operand1 number -operand2 number -operation [add|subtract]")
      .help('info')
      .argv

    .implies(x, y)
    如果设置了x, 则y就必须设置

    .locale()
    返回当前正在使用的yargs

    middleware(callbacks, [applyBeforeValidation])
    定义中间件

    .nargs(key, count)
    此方法表示,这后面的参数个数

    var argv = require('yargs')
      .nargs('token', 1)
      .parse(['--token', '-my-token']);
    
      //{ _: [], token: '-my-token', '$0': 'node test' }

    .normalize(key)
    据说是为了传入 path 的时候,便于调用 path.normalize()

    .number(key)
    告诉 parser,一直将这个key当作数字转换

    参数可以是数组

    选项如果并没有值,默认为undefined

    不能转化为数字,会被转换为NaN

    小数,16 进制数,科学计数法都是合法的

    var argv = require("yargs")
      .number("n")
      .number(["width", "height"]).argv;

    .option(key, [opt]) .options(key, [opt])

    为key配置各种选项的命令
    var argv = require("yargs").option("f", {
      alias: "file",
      demandOption: true,
      default: "/etc/passwd",
      describe: "x marks the spot",
      type: "string"
    }).argv;
    //同
    var argv = require("yargs")
      .alias("f", "file")
      .demandOption("f")
      .default("f", "/etc/passwd")
      .describe("f", "x marks the spot")
      .string("f").argv;
      //同
      var argv = require("yargs").options({
      f: {
        alias: "file",
        demandOption: true,
        default: "/etc/passwd",
        describe: "x marks the spot",
        type: "string"
      }
    }).argv;

    可用的 key 有以下这些

    • alias
    • array
    • boolean
    • choices
    • coerce
    • config
    • configParser
    • conflicts
    • count
    • default
    • defaultDescription
    • demandOption
    • desc/describe/description
    • global
    • group
    • hidden
    • implies
    • nargs
    • normalize
    • number
    • requiresArg
    • skipValidation
    • string
    • type: ‘array’,’boolean’,’count’,’number’,’string’

    .parse([args], [context], [parseCallback])

    可以替代从process.argv传参,返回 argv 对象。args 可以是数组或者原生参数字符串。

    context:可以同时携带的一个对象参数,可以为命令提供状态信息,是很实用的技术。

    const parser = yargs
      .command(
        "lunch-train <restaurant>",
        "start lunch train",
        function() {},
        function(argv) {
          console.log(argv.restaurant, argv.time);
        }
      )
      .parse("lunch-train rudy's", { time: "12:15" });
    
      

    parseCallback: 此方法的回调函数,会携带三个参数

    err: 转化中出现的验证错误
    argv: 转化的 argv 对象
    output: 将要在终端输出的文本

    const parser = yargs
      .command(
        "lunch-train <restaurant> <time>",
        "start lunch train",
        function() {},
        function(argv) {
          api.scheduleLunch(argv.restaurant, moment(argv.time));
        }
      )
      .help();
    
    parser.parse(bot.userText, function(err, argv, output) {
      if (output) bot.respond(output);
    });

    .pkgConf(key, [cwd])
    类似于 .config(),这表明 yargs 从 package.json 中寻找特定的配置对象
    cwd可以选择性地提供,package.json 将从这里读取

    .scriptName($0)
    设置执行文件的名字, $0

    var yargs = require("yargs")
    .scriptName("my-script")
    .help()
    .argv

    .wrap(columns)
    设置列

    .showHelp(consoleLevel=’error’)

    用 console 的consoleLevel打印使用数据 

    var yargs = require("yargs").usage(
      "$0 -operand1 number -operand2 number -operation [add|subtract]"
    );
    yargs.showHelp(); //prints to stderr using console.error()

    或者,使用标准输出打印使用信息,可以选择console.log:

    yargs.showHelp("log"); //prints to stdout using console.log()
  • 相关阅读:
    顺序队列C/C++实现
    顺序队列C/C++实现
    顺序队列C/C++实现
    Java文件拷贝
    Java文件拷贝
    三大范式与BCNF
    基础知识
    编辑软件
    Linux基础知识集锦
    Linux基础知识集锦
  • 原文地址:https://www.cnblogs.com/hellolol/p/11468787.html
Copyright © 2020-2023  润新知