持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情
上篇文章讲解了检查版本号和自定义log,接着下面按照这个图来实现准备阶段
检查node版本
因为很多库node版本不一样,所以需要设置一个node最低的版本
- 首先定义一个最低的node版本
- 通过process.version获取当前的node版本
- 通过第三方库 semver 来比较当前node版本和设置的最低node版本
- 如果当前node版本小于设置的最低node版本,就抛出异常,提示用户 安装 最低版本及以上的node版本
const { LOWEST_NODE_VERSION } = require('./const')
function core() {
// 使用try...catch来捕获错误信息,不显示出堆栈错误
try{
checkPkgVersion()
checkNodeVersion()
}catch(e){
log.error(e.message)
}
}
// 检查node版本
function checkNodeVersion(){
// 1.获取当前node版本
const currentVersion = process.version;
// 2.获取最低版本
const lowestVersion = LOWEST_NODE_VERSION;
// 3.比对,使用semver库
if(!semver.gte(currentVersion, lowestVersion)){
throw new Error(colors.red(`rd-cli 需要安装 v${lowestVersion} 以上版本的 Node.js`))
}
}
使用第三方库
semver: 版本比对
colors: 命令行带颜色
效果
当前node版本是v12,设置最低版本是v13
将最低版本改成v12,则不会出现提示
检查root启动
可以通过process.getuid()来获取当前是否是root账户
如果是0,则表示是root账户,如果是501,则表示非root账户
下面是打印的getuid
console.log(process.geteuid()) // 501
sudo console.log(process.geteuid()) // 0 root账户
当用户使用的是root账户是,我们在脚手架中实现自动降级,这里使用第三方库 root-check
只要调一下,root-check会自动帮我们降级
root-check
const checkRoot = require('root-check');
checkRoot()
sudo console.log(process.geteuid()) // 501,使用root-check自动降级了
下面贴一下 root-check的源码
root-check源码
'use strict';
var downgradeRoot = require('downgrade-root');
var sudoBlock = require('sudo-block');
module.exports = function () {
try {
downgradeRoot();
} catch (err) {}
sudoBlock.apply(null, arguments);
};
// downgrade-root
'use strict';
var isRoot = require('is-root');
var defaultUid = require('default-uid');
module.exports = function () {
if (isRoot()) {
// setgid needs to happen before setuid to avoid EPERM
if (process.setgid) {
var gid = parseInt(process.env.SUDO_GID, 10);
if (gid && gid > 0) {
process.setgid(gid);
}
}
if (process.setuid) {
var uid = parseInt(process.env.SUDO_UID, 10) || defaultUid();
if (uid && uid > 0) {
process.setuid(uid);
}
}
}
};
// isRoot:重点
export default function isRoot() {
return process.getuid && process.getuid() === 0;
}
// defaultUid,mac是501
var DEFAULT_UIDS = {
darwin: 501,
freebsd: 1000,
linux: 1000,
sunos: 100
};
module.exports = function (platform) {
return DEFAULT_UIDS[platform || process.platform];
};