arg

中文文档
5.0.2发布于 2022/06/06MITTypeScriptCommonJS零依赖近 30 天下载 4.1亿

解析器

中文使用文档
文档目录5 节
  1. 安装
  2. 使用量
  3. 选项
  4. 错误
  5. 我该怎么和他争吵 arg ? 吗?

参数

arg 是一个无偏移的 CLI 参数解析器.

安装

npm install arg

使用量

arg() 需要1或2个参数:

  1. 命令行规格对象(见下文)
  2. 解析选项( E)可选,默认为 {permissive: false, argv: process.argv.slice(2), stopAtPositional: false}(中文(简体) )

它返回一个带有命令行上任何值的对象( 丢失选项因此是) ),从由此产生的对象中消失。 arg 不进行验证/要求检查 - 我们 由申请决定.

所有未被选项所消耗的参数(通称"外"参数) 添加到 result._,这是 永远 数组(即使没有通过额外参数, 返回空数组.

const arg = require('arg');

// `options` is an optional parameter
const args = arg(
    spec,
    (options = { permissive: false, argv: process.argv.slice(2) })
);

例如:

$ node ./hello.js --verbose -vvv --port=1234 -n 'My name' foo bar --tag qux --tag=qix -- --foobar
// hello.js
const arg = require('arg');

const args = arg({
    // Types
    '--help': Boolean,
    '--version': Boolean,
    '--verbose': arg.COUNT, // Counts the number of times --verbose is passed
    '--port': Number, // --port <number> or --port=<number>
    '--name': String, // --name <string> or --name=<string>
    '--tag': [String], // --tag <string> or --tag=<string>

    // Aliases
    '-v': '--verbose',
    '-n': '--name', // -n <string>; result is stored in --name
    '--label': '--name' // --label <string> or --label=<string>;
    //     result is stored in --name
});

console.log(args);
/*
{
    _: ["foo", "bar", "--foobar"],
    '--port': 1234,
    '--verbose': 4,
    '--name': "My name",
    '--tag': ["qux", "qix"]
}
*/

每个键的QQ值对的值要么是一个类型(函数或[函数]),要么是一个字符串(表示别名).

  • 如果是函数,则将参数值的字符串值传递给它, 和返回值作为最终值.

  • 对于数组,唯一的元素 必须 是一个类型函数。 矩阵类型表示 以及由此产生的返回中的价值 对象是一个数组,其中包含所有使用指定旗帜传递的值.

  • 以弦为例,则起别名. 如果一面旗子被通过 匹配 键, (中文(简体) ), 接下来 价值 替换为它的位置.

类型函数通过三个参数:

  1. 参数值( 总是字符串)
  2. 参数名称( 如 . --label(中文(简体) )
  3. 目的地的上一个值(可用于类似减少操作或支持 -v 多次次数等)

这意味着内置 String, (中文(简体) ), Number,以及 Boolean 类型构造器“只是工作”作为类型函数.

请注意: Boolean 财务报告和审定财务报表 [Boolean] 有特殊待遇 - 一个选项论据是 没有 消费或通过,但相反 true 实值 已经返回。 这些选项被称为"旗".

对于希望表现为旗帜的自定义处理器,您可以将功能传递到 arg.flag()数字 :

const arg = require('arg');

const argv = [
    '--foo',
    'bar',
    '-ff',
    'baz',
    '--foo',
    '--foo',
    'qux',
    '-fff',
    'qix'
];

function myHandler(value, argName, previousValue) {
    /* `value` is always `true` */
    return 'na ' + (previousValue || 'batman!');
}

const args = arg(
    {
        '--foo': arg.flag(myHandler),
        '-f': '--foo'
    },
    {
        argv
    }
);

console.log(args);
/*
{
    _: ['bar', 'baz', 'qux', 'qix'],
    '--foo': 'na na na na na na na na batman!'
}
*/

还有, arg 提供名为“ 帮助” 的参数处理器 arg.COUNT,相当于 [Boolean] 参数的 .length 属性 - 在命令行上传递以密钥表示的布尔旗次数. 例如,这是你如何执行 ssh动词的多级( :-vvvv 成为最动词.

const arg = require('arg');

const argv = ['-AAAA', '-BBBB'];

const args = arg(
    {
        '-A': arg.COUNT,
        '-B': [Boolean]
    },
    {
        argv
    }
);

console.log(args);
/*
{
    _: [],
    '-A': 4,
    '-B': [true, true, true, true]
}
*/

选项

如果指定了第二个参数并且是一个对象,它会指定解析选项来修改 arg()。 。 。 .

argv

如果您已经切片或生成了一些要解析的原始参数( 而不是让 ) arg 切下来 process.argv您可以在 argv 选项.

例如:

const args = arg(
    {
        '--foo': String
    },
    {
        argv: ['hello', '--foo', 'world']
    }
);

结果是:

const args = {
    _: ['hello'],
    '--foo': 'world'
};

permissive

何时 permissive 设置为 true, (中文(简体) ), arg 将推动任何未知参数 到“ extra” 参数数组(result._)而不是抛出一个关于 不明旗帜.

例如:

const arg = require('arg');

const argv = [
    '--foo',
    'hello',
    '--qux',
    'qix',
    '--bar',
    '12345',
    'hello again'
];

const args = arg(
    {
        '--foo': String,
        '--bar': Number
    },
    {
        argv,
        permissive: true
    }
);

结果是:

const args = {
    _: ['--qux', 'qix', 'hello again'],
    '--foo': 'hello',
    '--bar': 12345
};

stopAtPositional

何时 stopAtPositional 设置为 true, (中文(简体) ), arg 将停止第一次解析 位置参数.

例如:

const arg = require('arg');

const argv = ['--foo', 'hello', '--bar'];

const args = arg(
    {
        '--foo': Boolean,
        '--bar': Boolean
    },
    {
        argv,
        stopAtPositional: true
    }
);

结果是:

const args = {
    _: ['hello', '--bar'],
    '--foo': true
};

错误

有些错误 arg 投掷提供 .code 属性,以帮助从用户错误中恢复,或 区分用户出错和开发者出错(bug).

(阿根廷语)

如果一个未知的选项( 未在 spec 对象中定义) 被通过, 则出现代码错误 ARG_UNKNOWN_OPTION 将扔出 :

// cli.js
try {
    require('arg')({ '--hi': String });
} catch (err) {
    if (err.code === 'ARG_UNKNOWN_OPTION') {
        console.log(err.message);
    } else {
        throw err;
    }
}
node cli.js --extraneous true
Unknown or unexpected option: --extraneous

财务问题

前所问之数相问答

我该怎么和他争吵 arg? 吗?

自己做断言,例如:

const args = arg({ '--name': String });

if (!args['--name']) throw new Error('missing required argument: --name');

许可证

释放 MIT 许可证。 。 。 .

版本与发布记录

arg 共发布 14 个版本,首次发布于 2012/06/01;过去 12 个月发布了 0 个版本。

版本发布日期距今
5.0.2latest2022/06/064 年前
5.0.12021/08/175 年前
5.0.02020/11/175 年前
4.1.32020/02/036 年前
4.1.22019/11/266 年前
4.1.12019/07/127 年前

关于 arg 的常见问题

arg 是什么?

解析器

如何安装 arg?

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

arg 支持 TypeScript 吗?

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

arg 支持 ESM 还是 CommonJS?

以 CommonJS 形式发布,可以直接 require();在 ES Module 项目中也可以用 import 引入(Node.js 会把 module.exports 作为默认导出)。

arg 可以商用吗?

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

arg 的下载量有多少?

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

arg 还在维护吗?

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