Lerna脚手架搭建(十五):脚手架初始化 + 全局参数注册

本文最后更新于:2023年8月21日 上午

一、命令注册 👈

  1. core/cli 下执行命令:cnpm i -S commander 安装 commander 包;
  2. 编辑 core/cli/lib/index.js 文件:
    1. 添加 commander 包引用: const commander = require('commander');
    2. 实例化 program 对象: const program = new commander.Command();;
    3. 创建 registerCommand 方法;
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    ...
    const pathExists = require('path-exists').sync;
    const commander = require('commander');
    ...
    let args;

    const program = new commander.Command();

    async function core() {
    try {
    checkPkgVersion();
    checkNodeVersion();
    checkRoot();
    checkUserHome();
    checkInputArgs();
    checkEnv();
    await checkGlobalUpdate();
    registerCommand();
    } catch (e) {
    log.error(e.message);
    }
    }

    function registerCommand() {
    program
    .version(pkg.version);

    program.parse(process.argv);
    }
    ...
    1. 分别执行 xuven-cli-devxuven-cli-dev -h运行结果:

  3. 编辑 core/cli/lib/index.js 文件的 registerCommand 方法,内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    function registerCommand() {
    program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version);

    program.parse(process.argv);
    }
  4. 执行 xuven-cli-dev -h 结果:
  5. 编辑 core/cli/lib/index.js 文件的 registerCommand 方法,内容如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    function registerCommand() {
    program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug', '是否开启调试模式', false);

    program.parse(process.argv);
    }
  6. 执行 xuven-cli-dev -h 结果:

二、开启 debug 模式 👈

  1. 编辑 core/cli/lib/index.js 文件的 registerCommand 方法,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    function registerCommand() {
    program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug', '是否开启调试模式', false);

    // 开启 debug 模式
    program.on('option:debug', function () {
    const {
    debug
    } = program.opts();
    if (debug) {
    process.env.LOG_LEVEL = 'verbose';
    } else {
    process.env.LOG_LEVEL = 'info';
    }
    log.level = process.env.LOG_LEVEL;
    log.verbose('test');
    });

    program.parse(process.argv);
    }
  2. 注释 core 方法中的 checkInputArgs();;

  3. 执行 xuven-cli-dev --debug 结果:

三、监听为知命令 👈

  1. 编辑 core/cli/lib/index.js 文件的 registerCommand 方法,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    function registerCommand() {
    program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug', '是否开启调试模式', false);

    // 开启 debug 模式
    program.on('option:debug', function () {
    const {
    debug
    } = program.opts();
    if (debug) {
    process.env.LOG_LEVEL = 'verbose';
    } else {
    process.env.LOG_LEVEL = 'info';
    }
    log.level = process.env.LOG_LEVEL;
    log.verbose('test');
    });

    // 对为知命令监听
    program.on('command:*', function (obj) {
    const availableCommands = program.commands.map(cmd => cmd.name());
    console.log(colors.red('未知的命令:' + obj[0]));
    if (availableCommands.length > 0) {
    console.log(colors.red('可用命令:' + availableCommands.join(',')));
    }
    })

    program.parse(process.argv);
    }
  2. 执行 xuven-cli-dev test,结果:

四、默认打印帮助信息 👈

  1. 编辑 core/cli/lib/index.js 文件的 registerCommand 方法,内容如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    function registerCommand() {
    program
    .name(Object.keys(pkg.bin)[0])
    .usage('<command> [options]')
    .version(pkg.version)
    .option('-d, --debug', '是否开启调试模式', false);

    // 开启 debug 模式
    program.on('option:debug', function () {
    const {
    debug
    } = program.opts();
    if (debug) {
    process.env.LOG_LEVEL = 'verbose';
    } else {
    process.env.LOG_LEVEL = 'info';
    }
    log.level = process.env.LOG_LEVEL;
    log.verbose('test');
    });

    // 对为知命令监听
    program.on('command:*', function (obj) {
    const availableCommands = program.commands.map(cmd => cmd.name());
    console.log(colors.red('未知的命令:' + obj[0]));
    if (availableCommands.length > 0) {
    console.log(colors.red('可用命令:' + availableCommands.join(',')));
    }
    })

    program.parse(process.argv);

    if (program.args && program.args.length < 1) {
    program.outputHelp();
    }
    }

Lerna脚手架搭建(十五):脚手架初始化 + 全局参数注册
https://blog.xuven.xyz/post/ScaffoldingInitialization/
作者
Xuven Li
发布于
2022年5月16日
许可协议