腳手架啟動前的檢查功能開發
- 接上文,仍舊在 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
, 查看輸出- 這時候就打印出錯誤棧了,輸出了一大堆
- 這樣就完成了腳手架前置的啟動檢查功能