@benev/argv

中文文档
0.3.14发布于 2026/02/21MITTypeScriptES Module零依赖构建来源已验证近 30 天下载 2744

命令行参数解析器

中文使用文档
文档目录14 节
  1. 自动生成 --help 页次
  2. 盖起你的 cli
  3. 配置你的cli的 args 财务报告和审定财务报表 params
  4. 参数和参数的验证
  5. help 到处都是!
  6. list 帮助者
  7. choice 帮助者
  8. multipleChoice 帮助者
  9. ++多树 commands
  10. 树战略
  11. 命令执行策略
  12. qq 自定义类型
  13. qq 自定义主题
  14. 给我一颗 gi星!

🎛️ @benev/argv

对打字符的最大命令行解析器, 也许

用于制作节点 cli 程序
难以置信的打字类型推论
零依赖关系
自由公开的源头,只为你


自动生成 --help 页次

pizza --help

pizza large --pepperoni --slices 3

# or, any way you like it
pizza --slices=9 large
pizza medium -p --slices=5
pizza small --pepperoni="no" --slices="2"

盖起你的 cli

  1. 安装 @benev/argv 通过 npm
    npm i @benev/argv
    
  2. 导入东西
    import {cli, command, arg, param, string, number} from "@benev/argv"
    
  3. 指定您的 cli, 并进行解析
    const {args, params} = cli(process.argv, {
      name: "pizza",
      commands: command({
        args: [
          arg("size").required(string),
        ],
        params: {
          slices: param.default(number, "1"),
          pepperoni: param.flag("p"),
        },
      }),
    }).tree
    
  4. 现在,你有你的标语和标语
    args.size // "large"
    params.slices // 5
    params.pepperoni // true
    
    • 这是接收您的参数和参数的"平面策略".
      简单,简单!
  5. 你们这种人都是自发的!
    我花了很长的时间才让它这么优雅和酷.

配置你的cli的 args 财务报告和审定财务报表 params

  • 我们先发出命令
    command({
      args: [],
      params: {},
    })
    
  • 命令可以选择接受 help 字符串
    command({
      help: "what a time to be alive!",
      args: [],
      params: {},
    })
    
  • 让我们添加位置参数
    command({
      args: [
        arg("active").required(boolean),
        arg("count").default(number, "101"),
        arg("name").optional(string),
      ],
      params: {},
    })
    
    • 参数在一个阵列中,所以每个阵列都需要一个名称,例如上面的"活性"
    • 有三个模式, required, (中文(简体) ), default,以及 optional
    • default 需要一个倒数
    • 有三个基本类型, string, (中文(简体) ), number,以及 boolean,但你可以 自己类型
  • 现在,让我们谈谈抛物
    command({
      args: [],
      params: {
        active: param.required(boolean),
        count: param.default(number, "101"),
        name: param.optional(string),
        verbose: param.flag("-v"),
      },
    })
    
    • 相当相似,但看到名字不同了吗?
    • 有种叫新车厢的 flag当然,这是自动的 boolean (怎么会是其他的?)

参数和参数的验证

  • 你可以设置一个 validate 函数在任意 arg 或者说 param
    arg("quality").optional(number, {
      validate: n => {
        if (n > 100) throw new Error("to big")
        if (n < 0) throw new Error("to smol")
        return n
      },
    })
    
    • 如果您在其中投出任何错误 validate,它将被打印出来 所有良好的用户

help 到处都是!

  • 事实上,每个 arg 财务报告和审定财务报表 param 可以拥有自己的 help
    command({
      help: "it's the best command, nobody makes commands like me",
    
      args: [
        arg("active").required(boolean, {
          help: "all systems go?",
        }),
    
        arg("count").default(number, "101", {
          help: "number of dalmatians",
        }),
    
        arg("name").optional(string, {
          help: `
            see this multi-line string?
            it will be trimmed all nicely on the help page.
          `
        }),
      ],
    
      params: {
        active: param.required(boolean, {
          help: "toggle this carefully!",
        }),
    
        count: param.default(number, "101", {
          help: "classroom i'm late for",
        }),
    
        name: param.optional(string, {
          help: "pick your pseudonym",
        }),
    
        verbose: param.flag("-v", {
          help: "going loud",
        }),
      },
    })
    

list 帮助者

  • 好吧,这是严重的疯狂酷, 看这个
    param.required(list(string))
    
  • 您可以在 list 帮助者
    • 用户输入逗号分隔值 mp3,wav,ogg
    • 获得数组 ["mp3", "wav", "ogg"]
  • 与 任何类型,像数字和这样的
    param.required(list(number))
    
    • 现在你得到一个 number[] 数组( 不是字符串)
    • 对, list 保存类型验证

choice 帮助者

  • 用户可以选择允许的值之一
    param.required(string, choice(["thick", "thin"]))
    
  • 你也可以加入帮助它
    param.required(string, choice(["thick", "thin"], {
      help: "made with organic whole-wheat flour",
    }))
    

multipleChoice 帮助者

  • 允许用户选择多个允许的选择
    param.required(string, multipleChoice(["bacon", "lettuce", "tomatoes"]))
    
  • 您可以添加帮助,并决定是否允许用户作出零选择
    param.required(string, choice(["bacon", "lettuce", "tomatoes"], {
      help: "all available ingredients are gmo'd",
      zeroAllowed: true, // defaults to false
    }))
    

++多树 commands

  • 页:1 commands 对象是一个递归树 command 叶子
    const {tree} = cli(process.argv, {
      name: "converter",
      commands: {
        image: command({
          args: [],
          params: {
            quality: param.required(number),
          },
        }),
        media: {
          audio: command({
            args: [],
            params: {
              mono: param.required(boolean),
            },
          }),
          video: command({
            args: [],
            params: {
              codec: param.required(string),
            },
          })
        },
      },
    })
    

树战略

  • 你明白吗 tree 反映其形状的天体
    tree.image?.params.quality // 9
    tree.media.audio?.mono // false
    tree.media.video?.codec // "av1"
    
    • 所有的命令都是 undefined 除了"选定"命令
    • 对,所有的打字都行

命令执行策略

  • 您可以选择提供每个命令的自动同步 execute 函数
    command({
      args: [],
      params: {
        active: param.required(boolean),
        count: param.default(number, "101"),
      },
      async execute({params}) {
        params.active // true
        params.count // 101
      },
    })
    
    • 您的执行函数收到相关的全类型 args, (中文(简体) ), params和一些东西
  •  execute 函数可以通过扔出一个 ExecutionError
    import {ExecutionError, command} from "@benev/argv"
    
    async execute({params}) {
      throw new ExecutionError("scary error printed in red!")
    }
    
  • 如果你选择使用这个命令执行策略, 那你需要调用您的 cli 的终局 execute 函数
    // 👇 awaiting cli execution
    await cli(process.argv, {
      name: "pizza",
      commands: {
        meatlovers: command({
          args: [],
          params: {
            meatiness: param.required(number),
          },
          async execute({params}) {
            console.log(params.meatiness) // 9
          },
        }),
        hawaiian: command({
          args: [],
          params: {
            pineappleyness: param.required(number),
          },
          async execute({params}) {
            console.log(params.pineappleyness) // 8
          },
        }),
      },
    }).execute()
      // ☝️ calling cli final execute
    

qq 自定义类型

  • 真不敢相信,我得到了所有的类型 工作所有与定制类型
  • 做自己的类型很容易
    const date = asType({
      name: "date",
      coerce: string => new Date(string),
    })
    
    • 页:1 name 在帮助页面中显示
    • 页:1 coerce 函数需要字符串输入,然后将其变成任何您喜欢的
  • 那样你就可以像正常人一样用它们来配乐
    param.required(date)
    
  • 嘿,为什么我们不列出他们的名单呢
    param.required(list(date))
    
  • 感觉很不舒服吗? 用这个奇怪的提示来制作一组自定义类型
    const myTypes = asTypes({
      date: string => new Date(string),
      integer: string => Math.floor(Number(string)),
    })
    
    • asTypes 将使用对象的属性名称作为类型 name
  • 您的自定义类型可以丢出出错误, 并起到校验作用
    const integer = asType({
      name: "integer",
      coerce: string => {
        const n = Number(string)
    
        if (isNaN(n))
          throw new Error("not a number")
    
        if (!Number.isSafeInteger(n))
          throw new Error("not a safe integer")
    
        return n
      },
    })
    

qq 自定义主题

  • 您可以为您的 -- help 页设置主题
    import {themes} from "@benev/argv"
    
    await cli(process.argv, {
    
      // the default theme
      theme: themes.standard,
    
      ...otherStuff,
    }).execute()
    
    • 也许试试 themes.seaside 更冷静的氛围
    • 如果你讨厌乐趣,用 themes.noColor 以禁用 ansi 颜色
  • 做你自己的主题像这样
    import {theme, color} from "@benev/argv"
    
    const seaside = theme({
      plain: [color.white],
      error: [color.brightRed, color.bold],
      program: [color.brightCyan, color.bold],
      command: [color.cyan, color.bold],
      property: [color.blue],
      link: [color.brightBlue, color.underline],
      arg: [color.brightBlue, color.bold],
      param: [color.brightBlue, color.bold],
      flag: [color.brightBlue],
      required: [color.cyan],
      mode: [color.blue],
      type: [color.brightBlue],
      value: [color.cyan],
    })
    

给我一颗 gi星!

  • 我太费劲了
  • 请针对任何问题或问题提出问题
  • 也许做一个很酷的帮助主题 并提交一个PR

版本与发布记录

@benev/argv 共发布 23 个版本,首次发布于 2023/01/06;过去 12 个月发布了 2 个版本。最新版本附带 npm provenance 构建来源证明,可追溯到公开的 CI 构建记录。

版本发布日期距今
0.3.14latest2026/02/218 个月前
0.3.132026/02/198 个月前
0.3.122025/08/071.3 年前
0.3.112025/07/101.3 年前
0.3.102025/04/241.5 年前
0.3.92025/04/111.6 年前

关于 @benev/argv 的常见问题

@benev/argv 是什么?

命令行参数解析器

如何安装 @benev/argv?

在项目目录运行 npm install @benev/argv,或使用 pnpm add / yarn add / bun add。

@benev/argv 支持 TypeScript 吗?

支持。包内自带 TypeScript 类型声明(package.json 声明了 types 入口),安装后即可获得类型提示,无需再安装 @types 包。

@benev/argv 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@benev/argv 可以商用吗?

@benev/argv 使用 MIT 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。以上为概括,不构成法律意见,请以许可原文为准。

@benev/argv 的下载量有多少?

根据 npm 官方下载统计,@benev/argv 在 2026/10/08 – 2026/11/06 这 30 天内被下载 2,744 次,日均约 91 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@benev/argv 还在维护吗?

最新版本 0.3.14 发布于 2026/02/21(8 个月前);至今共发布 23 个版本,其中过去 12 个月发布了 2 个;首次发布于 2023/01/06。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。