Yargs的使用介绍(附案例)

  1. 初始化使用
  2. 完整示例

初始化使用

const yargs = require('yargs/yargs');
const { hideBin } = require('yargs/helpers'); // hideBin用于做输入命令的参数解析
const arg = hideBin(process.argv); // 得到命令参数
const cli = yargs(arg);
cli
  .argv; //调用.argv,完成yargs初始化,这时候,输入hahayh --help 或 hahayh --version就能显示帮助信息或版本了
  • hideBin(process.argv)
    会得到命令的参数,相当于:
    require("process").argv.slice(2)
  • usage() 展示用法:
cli
  .usage('Usage: hahayh [command] <options>') 
   // 展示用法,当我们使用--help的时候展示,或者使用了strict()时,命令输入错误,展示错误提示的时候展示。
   // 这里可以使用$0来标识命令名称,也就是package.json中的bin的属性
  .argv;
  • strict() 启用严格模式
cli
  .strict()  
// 启用严格模式,
// 这个代表输入的参数不对的时候,会给我们一个错误提示。
// 如果没有这条,那么输入错误是没有任何反馈的。
  • demandCommand(个数,描述) 设置最少命令个数
cli
  .demandCommand(1, "A command is required. Pass --help to see all available commands and options.") 
// 需要输入的参数个数设定
// 当我们使用--help的时候展示,或者使用了strict()时,命令输入错误,展示错误提示的时候展示。
  • recommendCommands() 提示近似命令
cli
  .recommendCommands() // 当用户输错命令的时候,会提示近似命令
  • fail((err, msg) => {}) 输入错误命令的处理
cli
  .fail((err, msg) => { // 输入错误命令的时候进行处理,有了这个后,demandCommand无效,recommendCommands无效,其实就是--help的帮助信息看板无效
    // err是错误信息
    console.log(err)
    // 一般只需要打印err信息
  })
  • wrap(列数) 设置命令提示的宽度
cli
  .wrap(cli.terminalWidth()) 
  // 设置命令提示的宽度,可以尝试输入-h看下,展示出来界面的一行文字的宽度是不一样的。
  // 参数是数字,比如100,表示列数
  // 如果宽度为终端的宽度,那么可以使用方法cli.terminalWidth(),这里的cli就是yargs(hideBin(process.argv))
  • epilogue() 自定义结尾
const dedent = require('dedent');
cli // 来自初始化的cli
  .epilogue(dedent`  111

 1 11  ` + '222')
// 最终会显示如下
/*
111

1 11222
*/

// 自定义结尾,结尾加上我们想说的话,string类型
// 这里可以使用一个很有意思的库dedent,能够去掉每行首位的所有空格,但是不去空行,也就是去掉缩进(任何数目空格的缩进都去掉),注意去掉的是每行的收尾
  • 选项options
    • options() 批量注册选项
cli
  .options({
    debug: {
      type: 'boolean',
      describe: 'Bootstrap debug mode',
      alias: 'd', // --debug的缩写-d,也可以使用上面的alias
      hidden: false, // 这个options存在,但是可以控制--help的时候是否显示,一般用作内部开发用
      },
    rename: {
      type: 'string',
      describe: 'Bootstrap rename mode',
      aliases: ['rn', 'yhrn'], // 别名可以写成数组形式,-rn 或 -yhrn
      hidden: false,
    }
  })
  • option() 单个注册选项
cli
  .option('register', {
    // 跟options的区别是options可以批量注册options,而option只能单个注册
    type: 'string',
    describe: 'define global registry',
    alias: 'r',
    hidden: false, // 这个options存在,但是可以控制--help的时候是否显示,一般用作内部开发用
    })
  • group([option1,option2,…], 当前类别名称) 给options分类
cli
  .group(['debug'], 'Dev Options')
  .group(['version', 'help'], 'Cli Options')
  • 命令command
    • 第一种:.command(‘init [name]’, ‘Do init a project’, (yargs) => {}, (argv) => {})
      • 第一个参数:命令格式 (命令格式中的[option],在builder函数中注册)
      • 第二个参数:描述
      • 第三个参数:builder函数 (参数为yargs当前函数常用于注册option)
      • 第四个参数:handler函数 (参数为argv,命令输入时的参数)
cli
  .command(
    'init [name]',
    'Do init a project',
    (yargs) => {
      yargs.option('name', {
        type: 'string',
        describe: 'Name of a project',
        alias: 'n'
      })
    },
    (argv) => {
      console.log(argv)
      /*
      如果你输入的命令是hahayh init -d -r npm -n yh-test
      则得到的argv是:
      {
      _: [ 'init' ],
      d: true,
      debug: true,
      r: 'npm',
      register: 'npm',
      n: 'yh-test',
      name: 'yh-test',
      '$0':'..\\..\\..\\AppData\\Roaming\\npm\\node_modules\\haha-cli\\bin\\index.js'           }
      */
    }
  )
  • 第二种:参数(1个):对象类型
cli
  .command({
    command: 'list',
    aliases: ['ls', 'la', 'll'],
    describe: 'list local packages',
    builder: (yargs) => {},
    handler: (argv) => {
      console.log(argv)
    }
  })
  • alias() 别名
    • 用alias()注册别名
cli
  .alias('h', 'help')
  • 用属性注册别名(options中、option中、command中、builder中,凡是用对象注册的,都可以用)
    • 单个别名alias,值为字符串
    • 多个别名aliases,值为数组
cli
  .command({
    command: 'list',
    aliases: ['ls', 'la', 'll'], // 多别名
    describe: 'list local packages',
    builder: (yargs) => {},
    handler: (argv) => {
      console.log(argv)
    }})
  .command({
    command: 'mark',
    alias: 'mk', // 单别名
    describe: 'mark aomthng',
    builder: (yargs) => {},
    handler: (argv) => {
      console.log(argv)
    }})
  • parse() 混入自定义属性
const pkg = require("../package.json");
const context = {
  hahaVersion: pkg.version
}
const arg = hideBin(process.argv);
// 得到命令参数cli
// 初始化时的cli
// .argv;
// 调用.argv,完成yargs初始化,这时候,输入hahayh --help 或 hahayh --version就能显示帮助信息或版本了
// 最后也可以不用.argv,改成parse方法  .parse(arg, context)
// 这个parse作用是将参数arg和context合并,注入到yargs中,当你输入hahayh ls 的时候,argv中(handler函数中)就有hahaVersion了,这个hahaVersion就来自于context

完整示例

#!/usr/bin/env node
const yargs = require('yargs/yargs');
const { hideBin } = require('yargs/helpers'); // hideBin用于做输入命令的参数解析
// console.log(hideBin(process.argv)); // 会得到命令的参数,相当于require("process").argv.slice(2),这里的require("process")可以直接写成process,不用require也可以,一模一样的
// console.log(process.argv.slice(2)); 
const dedent = require('dedent');
const pkg = require("../package.json");

const context = {
  hahaVersion: pkg.version
}


const arg = hideBin(process.argv); // 得到命令参数
const cli = yargs(arg);
// yargs初始化
cli// yargs函数传入参数
  .usage('Usage: hahayh [command] <options>') // 展示用法,当我们使用--help的时候展示,或者使用了strict()时,命令输入错误,展示错误提示的时候展示。
  .demandCommand(1, "A command is required. Pass --help to see all available commands and options.") // 需要输入的参数个数设定,当我们使用--help的时候展示,或者使用了strict()时,命令输入错误,展示错误提示的时候展示。
                                                                                                     // 有了fail()后,此项无效
  .recommendCommands() // 当用户输错命令的时候,会提示近似命令
  .strict()  // 启用严格模式,这个代表输入的参数不对的时候,会给我们一个错误提示。如果没有这条,那么输入错误是没有任何反馈的。
  .fail((err, msg) => { // 输入错误命令的时候进行处理,有了这个后,demandCommand无效,recommendCommands无效,其实就是--help的帮助信息看板无效
    // 这个函数会执行2遍,第一遍err会是近似词提示,第二遍是错误信息
    // console.log('msg', msg)
    console.log('err', err)
    // 一般只需要打印err信息
  })
  .alias("h", "help")    // 别名,alias书写的顺序怎么样,那么展示就是怎么样的顺序
  .alias("v", "version")
  .wrap(cli.terminalWidth()) // 设置命令提示的宽度,可以尝试输入-h看下,展示出来界面的一行文字的宽度是不一样的。
             // 参数是数字,比如100,表示列数
             // 如果宽度为终端的宽度,那么可以使用方法cli.terminalWidth(),这里的cli就是yargs(hideBin(process.argv))
  .epilogue(dedent`
  When a command fails, all logs are written to lerna-debug.log in the current working directory.

  For more information, find our manual at https://github.com/lerna/lerna
`)        // 自定义结尾,结尾加上我们想说的话,string类型
             // 这里可以使用一个很有意思的库dedent,能够去掉每行首位的所有空格,但是不去空行,也就是去掉缩进(任何数目空格的缩进都去掉),注意去掉的是每行的收尾哦
  .options({ // 增加选项
    debug: { // 相当于增加了一个--debug选项,类型是布尔,描述是'Bootstrap debug mode'
      type: 'boolean',
      describe: 'Bootstrap debug mode',
      alias: 'd', // --debug的缩写-d,也可以使用上面的alias
      hidden: false, // 这个options存在,但是可以控制--help的时候是否显示,一般用作内部开发用
    }
  })
  .option('register', { // 跟options的区别是options可以批量注册options,而option只能单个注册
    type: 'string',
    describe: 'define global registry',
    alias: 'r',
    hidden: false, // 这个options存在,但是可以控制--help的时候是否显示,一般用作内部开发用
  })
  .group(['debug'], 'Dev Options:')        // 对已经注册的options进行分类
  .group(['register'], 'Publish Options:')
  // 以上主要是注册option
  // 以下主要是注册command
  /*
    注册命令使用command方法有2两种
      第一种:.command('init [name]', 'Do init a project', (yargs) => {}, (argv) => {})
        参数(4个):
          第一个参数:命令格式
            命令格式中的[option],在builder函数中注册
          第二个参数:描述
          第三个参数:builder函数
            参数为yargs
          第四个参数:handler函数
            参数为argv,命令输入时的参数
      第二种:
        参数(1个):对象类型
        .command({
          command: 'list',
          aliases: ['ls', 'la', 'll'],
          describe: 'list local packages',
          builder: (yargs) => {},
          handler: (argv) => {
            console.log(argv)
          }
        })
  */
  .command('init [name]', 'Do init a project', (yargs) => {
    yargs.option('name', {
      type: 'string',
      describe: 'Name of a project',
      alias: 'n'
    })
  }, (argv) => {
    console.log(argv)
    /*
      如果你输入的命令是hahayh init -d -r npm -n yh-test
      则得到的argv是:
      { _: [ 'init' ],
        d: true,
        debug: true,
        r: 'npm',
        register: 'npm',
        n: 'yh-test',
        name: 'yh-test',
        '$0':
        '..\\..\\..\\AppData\\Roaming\\npm\\node_modules\\haha-cli\\bin\\index.js' }
    */
  })
  .command({
    command: 'list',
    aliases: ['ls', 'la', 'll'],
    describe: 'list local packages',
    builder: (yargs) => {},
    handler: (argv) => {
      console.log(argv)
    }
  })
  // .argv;     // 调用.argv,完成yargs初始化,这时候,输入hahayh --help 或 hahayh --version就能显示帮助信息或版本了
  // 最后也可以不用.argv,改成parse方法
  .parse(arg, context) // 这个parse作用是将参数arg和context合并,注入到yargs中,当你输入hahayh ls 的时候,argv中(handler函数中)就有hahaVersion了,这个hahaVersion就来自于context

  // 定义脚手架的时候,别名不能重复,否则会覆盖
  // 别名可以单数alias,单数时为字符串;也可以复数aliases,复数时为数组

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 chaoyumail@126.com

×

喜欢就点赞,疼爱就打赏