1、yargs npm用法

  1. #!/usr/bin/env node
  2. const yargs = require('yargs/yargs')
  3. const { hideBin } = require('yargs/helpers')
  4. yargs(hideBin(process.argv))
  5. //command传4个参数,第一个command [optons](命令 参数),第二个 对命令的描述
  6. //第三个builder函数 执行该命令之前的操作 第四个参数 handler 最后执行command行为
  7. .command('serve [port]', 'start the server', (yargs) => {
  8. return yargs
  9. .positional('port', {
  10. describe: 'port to bind on',
  11. default: 5000
  12. })
  13. }, (argv) => {
  14. if (argv.verbose) console.info(`start server on :${argv.port}`)
  15. serve(argv.port)
  16. })
  17. .option('verbose', {
  18. alias: 'v',
  19. type: 'boolean',
  20. description: 'Run with verbose logging'
  21. })
  22. .parse()

基于3-2的项目

1、command

  1. .command(
  2. 'init [name]',
  3. 'do init a project',
  4. yargs => {
  5. yargs.option('name', {
  6. type: 'string',
  7. describe: 'name of a project',
  8. alias: 'n'
  9. })
  10. },
  11. argv => {
  12. console.log('argv:', argv)
  13. }
  14. )

image.png

所以别名不能重复

2、recommendCommands

  1. //当你输入一个错误的 command 的时候,会自动的帮助你去寻找一个最接近的 command 来提示你
  2. .recommendCommands()

image.png

3、fail

当 command 不存在时的错误处理,
当一个 command 不存在时,默认会输出 —help 的内容 ,如果我们不想看到,那么就可以在 fail 这个方法里进行定制

  1. .fail((err, msg) => {
  2. console.log(err)
  3. })

image.png

4、parse

  1. console.log('argv', process.argv)

image.png

  1. // 定义一个内容
  2. const context = {
  3. testVersion: pkg.version
  4. }
  5. //会把定义的内容注入到当前的项目中
  6. .parse(argv, context)

image.png

5、$0 表示取$0这个对象

  1. .usage('Usage: $0 [command] <options>')

image.png

6、完整写法

  1. #!/usr/bin/env node
  2. const yargs = require('yargs')
  3. const dedent = require('dedent')
  4. const os = require('os')
  5. //帮助处理参数解析
  6. const { hideBin } = require('yargs/helpers')
  7. const argv = process.argv.slice(2)
  8. const arg = hideBin(process.argv)
  9. const cli = yargs(arg)
  10. const pkg = require('../package.json')
  11. const opts = {
  12. loglevel: {
  13. defaultDescription: 'info',
  14. describe: 'What level of logs to report.',
  15. type: 'string'
  16. },
  17. concurrency: {
  18. defaultDescription: os.cpus().length,
  19. describe: 'How many processes to use when lerna parallelizes tasks.',
  20. type: 'number',
  21. requiresArg: true,
  22. hidden: true //是否显示在终端
  23. },
  24. 'reject-cycles': {
  25. describe: 'Fail if a cycle is detected among dependencies.',
  26. type: 'boolean'
  27. },
  28. 'no-progress': {
  29. describe: 'Disable progress bars. (Always off in CI)',
  30. type: 'boolean'
  31. },
  32. progress: {
  33. // proxy for --no-progress
  34. hidden: true,
  35. type: 'boolean'
  36. },
  37. 'no-sort': {
  38. describe: 'Do not sort packages topologically (dependencies before dependents).',
  39. type: 'boolean'
  40. },
  41. sort: {
  42. // proxy for --no-sort
  43. hidden: true,
  44. type: 'boolean'
  45. },
  46. 'max-buffer': {
  47. describe: 'Set max-buffer (in bytes) for subcommand execution',
  48. type: 'number',
  49. requiresArg: true
  50. }
  51. }
  52. const globalKeys = Object.keys(opts).concat(['help', 'version'])
  53. // 定义一个内容
  54. const context = {
  55. testVersion: pkg.version
  56. }
  57. //配置宽度
  58. // 配置 cli 结尾的内容
  59. //配置结尾
  60. // 配置 cli 结尾的内容
  61. cli
  62. //cli 配置首行
  63. .usage('Usage: $0 [command] <options>')
  64. // 配置输入的最小命令,为1,否则弹出提示
  65. .demandCommand(1, 'A command is required. Pass --help to see all available commands and options.')
  66. // 开启严格模式
  67. .strict()
  68. //命令别名
  69. //命令别名
  70. .alias('h', 'help')
  71. .alias('v', 'version')
  72. // 配置cli的宽度和命令行一样
  73. .wrap(cli.terminalWidth())
  74. .epilogue(
  75. dedent`
  76. When a command fails, all logs are written to lerna-debug.log in the current working directory.
  77. For more information, find our manual at https://github.com/lerna/lerna
  78. `
  79. )
  80. // 对 options 进行分组
  81. .group(globalKeys, 'Global Options:')
  82. .options(opts)
  83. .options({
  84. debug: {
  85. type: 'boolean',
  86. describe: 'Bootstrap debug mode',
  87. alias: 'd'
  88. }
  89. })
  90. .group(['debug'], 'dev Options:')
  91. // 添加了一个隐藏的 option
  92. .option('ci', {
  93. hidden: true,
  94. type: 'boolean'
  95. })
  96. .command(
  97. 'init [name]',
  98. 'do init a project',
  99. yargs => {
  100. yargs.option('name', {
  101. type: 'string',
  102. describe: 'name of a project',
  103. alias: 'n'
  104. })
  105. },
  106. argv => {
  107. console.log('argv:', argv)
  108. }
  109. )
  110. //根据@lerna/list/command的语法,command也可以传入对象
  111. .command({
  112. command: 'list',
  113. aliases: ['ls', 'la', 'll'],
  114. describe: 'List local packages',
  115. builder: yargs => {},
  116. handler: yargs => {}
  117. })
  118. //当你输入一个错误的 command 的时候,会自动的帮助你去寻找一个最接近的 command 来提示你
  119. .recommendCommands()
  120. .fail((err, msg) => {
  121. console.log(err)
  122. })
  123. .parse(argv, context)
  124. //epilogue 配置结尾