6. 脚手架命令注册和执行

7 阅读1分钟

commander

commander 是一个非常流行的 Node.js 命令行界面(CLI)开发工具,用于快速构建自定义的命令行工具,简化命令解析、参数处理、帮助文档生成等工作。它广泛应用于前端工程化工具(如脚手架、构建工具)的开发。

npm install commander --save

命令注册

const commander = require('commander');
const program = new commander.Command();
program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .parse(process.argv)

program.name('命令名') 用于设置 CLI 的调用名称,终端中需通过该名称执行工具;

Usage: web-starter <command> [options]

program.version()读取 package.json 中配置的项目版本号,并将其作为 CLI 工具的版本号。 调用 .version(pkg.version) 后,会自动为 CLI 工具添加两个内置命令行选项,无需额外编写代码:

  • 短选项:-V(大写字母 V,注意不是小写 v)
  • 长选项:--version
function registerCommand(argv) {
    // 对于布尔选项,需要明确指定默认值为 false
    program
        .name(Object.keys(pkg.bin)[0]).usage('<command> [options]')
        .version(pkg.version, '-v, --version')
        .option('-d, --debug', '是否开启调试模式', false)

    program
        .command('init [projectName]')
        .option('-f, --force', '是否强制初始化项目')
        .action(exec);

    // 注册未知命令处理事件,必须在 parse 之前注册
    program.on('command:*', function (obj) {
        const availableCommands = program.commands.map(cmd => cmd.name());
        log.error('未知的命令:' + obj[0]);
        if (availableCommands.length > 0) {
            log.error('可用命令:' + availableCommands.join(','));
        }
    });
    // 所有事件监听器(包括 command:* )必须在调用 program.parse() 之前注册,否则无法被触发。
    program.parse(argv || process.argv);

    const options = program.opts();

    // 检查debug模式
    if (options.debug) {
        process.env.LOG_LEVEL = 'verbose';
    } else {
        process.env.LOG_LEVEL = 'info';
    }
    log.level = process.env.LOG_LEVEL;

    // 如果没有输入命令,输出帮助信息
    if (program.args && program.args.length < 1) {
        program.outputHelp();
        console.log();
    }
}