HOW - 命令行命令或选项解析方式

方式一:process.argv

在编写 npm 包时,可以使用 Node.js 中的 process 对象来解析 CLI 入参。

process 对象包含了当前 Node.js 进程的相关信息,其中 argv 属性存储了从命令行传入的参数。argv 是一个数组,其中第一个元素是 Node.js 的执行路径,第二个元素是当前执行的 JavaScript 文件路径,从第三个元素开始则是传入的命令行参数

以下是一个简单的示例,演示如何使用 process.argv 解析 CLI 入参:

//node myScript.js arg1 arg2 arg3
//node myScript.js --name=value
//node myScript.js -f
console.log(process.argv);
// 输出:[ 'node', '/path/to/myScript.js', 'arg1', 'arg2', 'arg3' ]

// 获取命令行参数
const args = process.argv.slice(2); // 去掉前两个元素(执行路径和脚本路径)
console.log(args); // 输出:['arg1', 'arg2', 'arg3']

// 解析参数
const options = {};
args.forEach(arg => {
  if (arg.startsWith('--')) {
    // 形如 --name=value
    const [name, value] = arg.slice(2).split('=');
    options[name] = value || true;
  } else if (arg.startsWith('-')) {
    // 形如 -f
    const name = arg.slice(1);
    options[name] = true;
  } else {
    // 位置参数
    options._ = options._ || [];
    options._.push(arg);
  }
});
console.log(options);
// 输出:
// {
//   _: [ 'arg1', 'arg2', 'arg3' ],
//   name: 'value',
//   f: true
// }

这是一个简单的命令行参数解析器,它可以处理位置参数、带有值的长选项(如 --name=value)、不带值的短选项(如 -f)等情况。根据具体的需求,你可以对其进行扩展和定制。

方式二:node:util.parseArgs

node:util.parseArgs 是 Node.js 内置模块 util 中的一个方法,用于解析命令行参数。这个方法可以帮助你将命令行参数解析成一个对象,其中键是参数名,值是参数值。

下面是一个简单的示例:

const { parseArgs } = require('node:util');

// 假设命令行参数为: node script.js --port=3000 --host=localhost --debug
const args = parseArgs(process.argv.slice(2));

console.log('Parsed arguments:', args);
// { port: '3000', host: 'localhost', debug: true }

在这个示例中,我们假设命令行参数为 node script.js --port=3000 --host=localhost --debug。我们使用 process.argv.slice(2) 来获取除了前两个元素(node 和脚本路径)之外的所有参数,并将它们传递给 parseArgs 方法进行解析。解析后的参数将存储在 args 对象中。

parseArgs 函数除了解析命令行参数外,还支持定义命令行选项(options)。这些选项可以用来指定命令行参数的格式、默认值以及其他属性。下面是一个示例代码:

const { parseArgs } = require('util');

const options = [
  { name: 'port', type: 'number', defaultValue: 3000, description: 'The port to listen on' },
  { name: 'host', type: 'string', defaultValue: 'localhost', description: 'The host address' },
  { name: 'debug', type: 'boolean', defaultValue: false, description: 'Enable debug mode' }
];

const args = process.argv.slice(2);
const parsedArgs = parseArgs(args, options);

console.log('Parsed arguments:', parsedArgs);

在这个示例中,我们定义了一个名为 options 的数组,其中包含了三个命令行选项:porthostdebug。每个选项都有一个 name 属性表示选项的名称,一个 type 属性表示选项的数据类型,一个 defaultValue 属性表示选项的默认值,以及一个 description 属性表示选项的描述信息。

然后我们调用 parseArgs 函数来解析命令行参数,并传入了 options 数组作为第二个参数。这样一来,解析后的结果将会包含我们定义的选项信息,以及命令行参数的其他信息。

方式三:yargs.parse

yargs.parse()yargs 库的一个方法,用于解析命令行参数并返回解析结果。它接收一个可选的命令行参数数组作为参数,并返回一个包含解析结果的对象。yargs 是 Webpack 使用的方式

以下是使用 yargs.parse() 方法的示例代码:

const yargs = require('yargs');

// 解析命令行参数
// yargs.parse(process.argv.slice(2))
const argv = yargs.parse(['--name', 'Alice', '--greeting', 'Hi']);
// 输出解析结果
console.log(argv);
// { name: 'Alice', greeting: 'Hi' }

在这个示例中,我们手动提供了一个命令行参数数组 ['--name', 'Alice', '--greeting', 'Hi'],然后通过 yargs.parse() 方法解析了这些参数。解析结果将会是一个对象,其中包含了对应的选项值。

另外,使用 yargs 可以轻松地定义命令行工具的命令、选项和参数,并且可以通过链式调用的方式对其进行配置和定制,使得命令行工具的开发更加便捷和灵活。

以下是一个简单的使用 yargs 的示例:

const yargs = require('yargs');

// 定义命令行工具的命令和选项
const argv = yargs
  .command('hello', '打印欢迎信息', function (yargs) {
    // 子命令 hello 的配置
    return yargs.option('name', {
      describe: '要打招呼的名字',
      type: 'string',
      demandOption: true, // 是否必需
    });
  }, function (argv) {
    // hello 命令的处理函数
    console.log(`Hello, ${argv.name}!`);
  })
  .help() // 添加帮助信息
  .argv; // 解析命令行参数

在上面的示例中,我们首先引入了 yargs 模块,然后通过 command 方法定义了一个名为 hello 的命令,该命令用于打印欢迎信息。在命令的配置函数中,我们通过 option 方法定义了一个名为 name 的选项,表示要打招呼的名字,并指定了选项的描述、类型和是否必需。然后,在命令的处理函数中,我们使用 argv.name 获取了命令行参数中的名字,并打印出欢迎信息。最后,通过 help 方法添加了帮助信息,使得用户可以通过命令行工具的 --help 选项获取命令的使用帮助。

总的来说,yargs 是一个功能强大、易用灵活的命令行参数解析库,适用于各种命令行工具的开发场景。

方式四:commander

commander 提供了一种简洁而强大的方式来创建命令行工具。commander 可以帮助你定义和解析命令行选项和参数,支持指令配置。

下面是一个使用 commander 创建简单命令行工具的示例:

const { program } = require('commander');

program
  .option('-p, --port <port>', 'Set the server port')
  .option('-h, --host <host>', 'Set the server host')
  .option('-d, --debug', 'Output extra debugging');

program.parse(process.argv);
const options = program.opts();
console.log('Options:', options);

在这个示例中,我们使用 commander 定义了三个选项:--port--host--debug。用户可以在命令行中使用这些选项来设置服务器的端口、主机和调试模式。

下面是 @vue/cli 实现:

program
    .version(`@vue/cli ${require('../package').version}`)
    .usage('<command> [options]')
program
    .command('create <app-name>')
    .descriptioin('create a new project powered by vue-cli-service')
    .option('-p --preset <presetName>', 'xxx')
    .option('...')
    .action(name, options) => {
        if (minimist(process.argv.slice(3))._.length > 1) {
            console.log(chalk.yellow('\n Info: You provided more than one argument. The first one will be used as the app\'s name, the rest are ignored.'))
        }
        // ...

        require('../lib/create')(name, options)
    }

解释:

program.version(`@vue/cli ${require('../package').version}`)

这行代码定义了命令行工具的版本号。

program..usage('<command> [options]')

这行代码定义了命令行工具的用法。<command> 表示命令的名称,[options] 表示命令的选项。

program.command('create <app-name>')

这行代码定义了一个名为 create 的命令,其中 <app-name> 表示命令的参数,即要创建的项目名称。

program.descriptioin('create a new project powered by vue-cli-service')

这行代码为 create 命令添加了描述信息,说明了这个命令的作用。

program.option('-p --preset <presetName>', 'xxx')

这行代码定义了一个选项 -p--preset,并指定了该选项的描述信息为 'xxx'。该选项可以用来指定预设名称。

program.action(name, options) => {}

这是 create 命令的执行函数,当用户在命令行中输入了 create 命令时,该函数将被调用执行。在函数内部,首先通过 minimist(process.argv.slice(3))._.length 判断用户输入的参数数量,如果大于 1,则打印一条警告信息。然后调用 require('../lib/create')(name, options) 来执行具体的创建项目的逻辑。

总的来说,以上配置定义了一个 create 命令,该命令用于创建一个新的项目,并提供了一个名为 preset 的选项用来指定预设名称。

chalk:上色

如果你想要给命令行输出添加颜色,你可以使用 chalk 这个库。chalk 提供了一种简单的方式来为控制台输出添加颜色和样式。

例如:

const chalk = require('chalk');
console.log(chalk.green('This is green text'));
console.log(chalk.blue.bold('This is bold blue text'));
console.log(chalk.bgRed.white('This is red background with white text'));

chalk 提供了许多方法来设置不同的颜色和样式,你可以根据需要选择适合的颜色来美化你的命令行输出。

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值