脚手架核心流程开发
# 拆分原则
根据模块的功能拆分:
- 核心模块: core
- 命令模块: commands
- 模型模块: models
- 工具模块: utils
root-check
尝试降级具有root权限的进程的权限,如果失败则阻止访问
# 执行准备
创建功能模块文件夹, 并配置lerna packages
# 检查版本号
添加log lerna包
lerna create @zh-dev-cli/log utils
如果你像我这样包的路径修改了的话就需要注意在更路径的package.json文件中workspaces 添加utils
// utils/log/lib/index.js
const log = require('npmlog')
log.level = process.env.LOG_LEVEL ?? 'info'
log.heading = 'zh-dev-cli'
log.addLevel('success', 2000, {fg: 'green', bold: true})
module.exports = log;
1
2
3
4
5
6
7
2
3
4
5
6
7
// core/cli/lib/index.js
const pkg = require('../package.json')
const log = require('@zh-dev-cli/log')
function checkPkgVersion () {
let version = pkg.version;
log.notice('cli', version)
}
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 检查node 版本
semver
npm的语义版本器, 做各种各样的版本比对. 周下载量很高
colors
在node.js控制台中获取颜色和样式
// const.js
const LOWEST_NODE_VERSION = '12.0.0'
module.exports = {
LOWEST_NODE_VERSION
}
1
2
3
4
5
6
7
2
3
4
5
6
7
// cli.js
const semver = require('semver')
const colors = require('colors/safe');
...
function checkNodeVersion() {
const currentVersion = process.version
const lowestVersion = constant.LOWEST_NODE_VERSION
if(semver.lt(currentVersion, lowestVersion)) {
throw new Error(colors.red(`zh-dev-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`))
}
}
function core () {
try {
checkPkgVersion()
checkNodeVersion()
} catch (e) {
log.error(e?.message)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 检查root启动
process.geteuid()
如果是0 , 说明是root账户, root账户所创建的文件是属于root账户的, 不变改写. 需要降级
root-check
尝试降级具有root权限的进程的权限,如果失败则阻止访问
lerna add root-check@1.0.0 core/cli
安装
function checkRoot() {
const rootCheck = require('root-check')
rootCheck()
}
1
2
3
4
2
3
4
# 检查用户主目录
user-home 废弃 使用os-homedir
返回当前用户的主目录。
path-exists
检查路径是否存在
安装: lerna add path-exists@4.0.0 core/cli
5.0.0版本需要使用到import导入, 与cjs不符
const pathExists = require('path-exists').sync;
...
function checkUserHome() {
if(!userHome || !pathExists(userHome)) {
throw new Error(colors.red('当前登录用户主目录不存在'))
}
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# 检查入参
minimist
解析参数选项 这个模块是乐观主义者的论点解析器的核心,没有任何花哨的装饰。
// 示例 var argv = require('minimist')(process.argv.slice(2)); console.log(argv); $ node example/parse.js -a beep -b boop { _: [], a: 'beep', b: 'boop' }
1
2
3
4
5
6
checkInputArgs()
const log = require('@zh-dev-cli/log')
...
function checkInputArgs() {
const argv = require('minimist')(process.argv.slice(2));
checkArgs(argv)
}
function checkArgs(args) {
process.env.LOG_LEVEL = args.debug ? 'verbose' : 'info'
}
...
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
# 检查环境变量
dotenv
Dotenv是一个零依赖模块,它将环境变量从.env文件加载到process.env中。将配置与代码分开存储在环境中是基于the Twelve Factor App方法。
# 检查是否为最新版本
拿到当前版本号和包名
通过包名在线上通过ajax拿到所有的版本, 并对其倒序排序, 最后取第一个
把最新版本号和当前版本号作对比
上次更新: 2023/06/10, 12:06:41