脚手架启动前的检查功能开发
- 接上文,仍旧在 abc-cli 项目中
- 参考:https://blog.csdn.net/Tyro_java/article/details/136431320
- 现在要在脚手架启动前要做一些逻辑,可以在 hook 钩子函数中去书写
- 比如,进行node版本的对比,使用
semver
工具 - 在 abc-cli 目录下,执行 $
npm i semver -w packages/cli
- 在 abc-cli/packages/cli/lib/index.js 中
const commander = require('commander'); const createInitCommand = require('@abc.com/init'); const { log } = require('@abc.com/utils'); const { program } = commander; const pkg = require('../package.json'); const semver = require('semver');const LOWEST_NDDE_VERSION = '14.0.0'; // 最低允许运行的node版本// 检查node版本 function checkNodeVersion() {log.verbose('node version: ', process.version);// 前面 大于等于后面这个, 取反判断,也就是如果不大于等于,处理相关逻辑if (!semver.gte(process.version, LOWEST_NDDE_VERSION)) {// 中断并报错throw new Error(`abc-cli 需要最低的nodejs版本为:${LOWEST_NDDE_VERSION}`)} }function preAction() {// 检查node版本checkNodeVersion() }module.exports = (args) => {log.success('log test version', pkg.version);program.name(Object.keys(pkg.bin)[0]).usage('<command> [options]').version(pkg.version).option('-d, --debug', '是否开启调试模式', false).hook('preAction', preAction);createInitCommand(program); // 注册命令program.parse(process.argv) }
- 这里可以调大上面
LOWEST_NDDE_VERSION
的参数来做测试,比如114.0.0
版本 - 在 abc-cli 目录下执行 $
abc-cli init ss
发现报错了 - 以上会报错,但是控制台输出非常难看, 因为打印出了错误栈,现在来优化下这个问题
- 在
module.exports
上面添加这行process.on('uncaughtException', function(e) {console.log(e.message); })
- 再次执行,验证,返回信息为:
abc.com success log test version 0.0.0 abc-cli 需要最低的nodejs版本为:114.0.0
- 这样就没有报错的错误栈的问题了
- 同时,可以优化下 debug 的选项判断,这块比较通用单独抽离出来
- 在 abc-cli/packages/utils/lib/isDebug.js
const { argv } = process; const isDebug = argv.includes('--debug') || argv.includes('-d');module.exports = isDebug;
- 在之前 abc-cli/packages/utils/lib/log.js 中修改对 isDebug的使用
const isDebug = require('./isDebug');// 基于调试模式来确定输出日志的等级 if (isDebug) {log.level = 'verbose' } else {log.level = 'info'; }
- 并在 abc-cli/packages/utils/lib/index.js 中注册 isDebug
const log = require('./log') const isDebug = require('./isDebug')module.exports = {log,isDebug, }
- 同样,在 abc-cli/packages/cli/lib/index.js 中的错误监听中,这么修改
const { log, isDebug } = require('@abc.com/utils');process.on('uncaughtException', function(e) {// 如果是 debug 模式,则输出错误栈,否则直接输出信息if (isDebug) {console.log(e);} else {console.log(e.message);} })
- 在 abc-cli 目录下执行 $
abc-cli init xx
, 查看输出正常abc.com success log test version 0.0.0 abc-cli 需要最低的nodejs版本为:114.0.0
- 在 abc-cli 目录下执行 $
abc-cli init xx -d
, 查看输出- 这时候就打印出错误栈了,输出了一大堆
- 这样就完成了脚手架前置的启动检查功能