Lerna脚手架搭建(十二):环境变量检查功能开发

本文最后更新于:2024年12月10日 下午

一、安装 detenv 库 👈

  1. core/cli/ 目录下,执行命令 cnpm i -S detenv 安装 dotenv 库;

二、获取环境变量 👈

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

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
'use strict';

module.exports = core;

const semver = require('semver');
const colors = require('colors/safe');
const userHome = require('user-home');
const pathExists = require('path-exists').sync;
const log = require('@xuven-cli-dev/log');

const constant = require('./const');
const pkg = require('../package.json');

let args, config;

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

function checkEnv() {
const dotenv = require('dotenv');
config = dotenv.config();
log.verbose('环境变量', config);
}

function checkInputArgs() {
const minimist = require('minimist');
args = minimist(process.argv.slice(2));
checkArgs();
}

function checkArgs() {
if (args.debug) {
process.env.LOG_LEVEL = 'verbose';
} else {
process.env.LOG_LEVEL = 'info';
}
log.level = process.env.LOG_LEVEL;
}

function checkUserHome() {
if (!userHome || !pathExists(userHome)) {
throw new Error(colors.red('当前登录用户主目录不存在!'));
}
}

function checkRoot() {
const rootCheck = require('root-check');
rootCheck();
}

function checkNodeVersion() {
const currentVersion = process.version;
const lowestVersion = constant.LOWEST_NODE_VERSION;
if (!semver.gte(currentVersion, lowestVersion)) {
throw new Error(colors.red(`xuven-cli-dev 需要安装 v${lowestVersion} 以上版本的 Node.js`));
}
}

function checkPkgVersion() {
log.info('cli', pkg.version);
}
  1. 执行 xuven-cli-dev --debug 命令,发现报错,找不到文件或文件夹;

  2. 编辑 checkEnv 方法,内容如下(加入 path 库 const path = require('path');):

1
2
3
4
5
6
7
8
9
...
function checkEnv() {
const dotenv = require('dotenv');
config = dotenv.config({
path: path.resolve(userHome, '.env'),
});
log.verbose('环境变量', config);
}
...
  1. 执行 xuven-cli-dev --debug 命令,发现报错,没有权限(我这里用的是 root 账户);

  2. 注释 core/cli/lib/index.js 文件内的 rootCheck(); 行,再次执行,输出:

  3. 由于我们没有判断 .env 文件是否存在,这里,我们改正一下,编辑 checkEnv 方法,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
...
function checkEnv() {
const dotenv = require('dotenv');
const dotenvPath = path.resolve(userHome, '.env');
if (pathExists(dotenvPath)) {
config = dotenv.config({
path: dotenvPath,
});
}
log.verbose('环境变量', config);
}
...
  1. 编辑 ~/.env,内容如下:

1
2
3
CLI_HOME=.xuven-cli
DB_USER=root
DB_PWD=123456
  1. 再次执行 xuven-cli-dev --debug 命令,输出如下:

  2. 再次编辑 checkEnv 方法,内容如下:

1
2
3
4
5
6
7
8
9
10
function checkEnv() {
const dotenv = require('dotenv');
const dotenvPath = path.resolve(userHome, '.env');
if (pathExists(dotenvPath)) {
config = dotenv.config({
path: dotenvPath,
});
}
log.verbose('环境变量', config, process.env.DB_USER);
}
  1. 再次执行 xuven-cli-dev --debug 命令,输出如下:
    由此可见,配置文件里的参数已加入到 process.env 内。

  2. 因此,我们只需如下配置即可:

1
2
3
4
5
6
7
8
9
function checkEnv() {
const dotenv = require('dotenv');
const dotenvPath = path.resolve(userHome, '.env');
if (pathExists(dotenvPath)) {
dotenv.config({
path: dotenvPath,
});
}
}

三、配置默认环境变量 👈

上一步中,我们获取到了 ~/.env 文件内的环境变量,如果 ~/.env 内没有环境变量,我们则需要配置默认的环境变量,这里有两种方案可以配置环境变量,推荐第二种方案。

方案一

  1. 编辑 core/cli/lib/const.js 文件,添加 DEFAULT_CLI_HOME 参数,内容如下:

1
2
3
4
5
6
7
const LOWEST_NODE_VERSION = '14.0.0';
const DEFAULT_CLI_HOME = '.xuven-cli';

module.exports = {
LOWEST_NODE_VERSION,
DEFAULT_CLI_HOME,
}
  1. 编辑 core/cli/lib/index.js,添加 createDefaultConfig 方法,内容如下:

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
'use strict';

module.exports = core;

const path = require('path');
const semver = require('semver');
const colors = require('colors/safe');
const userHome = require('user-home');
const pathExists = require('path-exists').sync;
const log = require('@xuven-cli-dev/log');

const constant = require('./const');
const pkg = require('../package.json');

let args, config;

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

function checkEnv() {
const dotenv = require('dotenv');
const dotenvPath = path.resolve(userHome, '.env');
if (pathExists(dotenvPath)) {
dotenv.config({
path: dotenvPath,
});
}
config = createDefaultConfg();
log.verbose('环境变量', config);
}

function createDefaultConfg() {
const cliConfig = {
home: userHome,
};
if (process.env.CLI_HOME) {
cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME);
} else {
cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME);
}
return cliConfig;
}

function checkInputArgs() {
const minimist = require('minimist');
args = minimist(process.argv.slice(2));
checkArgs();
}

function checkArgs() {
if (args.debug) {
process.env.LOG_LEVEL = 'verbose';
} else {
process.env.LOG_LEVEL = 'info';
}
log.level = process.env.LOG_LEVEL;
}

function checkUserHome() {
if (!userHome || !pathExists(userHome)) {
throw new Error(colors.red('当前登录用户主目录不存在!'));
}
}

function checkRoot() {
const rootCheck = require('root-check');
// rootCheck();
}

function checkNodeVersion() {
const currentVersion = process.version;
const lowestVersion = constant.LOWEST_NODE_VERSION;
if (!semver.gte(currentVersion, lowestVersion)) {
throw new Error(colors.red(`xuven-cli-dev 需要安装 v${lowestVersion} 以上版本的 Node.js`));
}
}

function checkPkgVersion() {
log.info('cli', pkg.version);
}
  1. 再次执行 xuven-cli-dev --debug 命令,输出如下:

方案二

  1. 编辑 core/cli/lib/index.js,内容如下:

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
'use strict';

module.exports = core;

const path = require('path');
const semver = require('semver');
const colors = require('colors/safe');
const userHome = require('user-home');
const pathExists = require('path-exists').sync;
const log = require('@xuven-cli-dev/log');

const constant = require('./const');
const pkg = require('../package.json');

let args;

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

function checkEnv() {
const dotenv = require('dotenv');
const dotenvPath = path.resolve(userHome, '.env');
if (pathExists(dotenvPath)) {
dotenv.config({
path: dotenvPath,
});
}
createDefaultConfg();
log.verbose('环境变量', process.env.CLI_HOME_PATH);
}

function createDefaultConfg() {
const cliConfig = {
home: userHome,
};
if (process.env.CLI_HOME) {
cliConfig['cliHome'] = path.join(userHome, process.env.CLI_HOME);
} else {
cliConfig['cliHome'] = path.join(userHome, constant.DEFAULT_CLI_HOME);
}
process.env.CLI_HOME_PATH = cliConfig.cliHome;
}

function checkInputArgs() {
const minimist = require('minimist');
args = minimist(process.argv.slice(2));
checkArgs();
}

function checkArgs() {
if (args.debug) {
process.env.LOG_LEVEL = 'verbose';
} else {
process.env.LOG_LEVEL = 'info';
}
log.level = process.env.LOG_LEVEL;
}

function checkUserHome() {
if (!userHome || !pathExists(userHome)) {
throw new Error(colors.red('当前登录用户主目录不存在!'));
}
}

function checkRoot() {
const rootCheck = require('root-check');
// rootCheck();
}

function checkNodeVersion() {
const currentVersion = process.version;
const lowestVersion = constant.LOWEST_NODE_VERSION;
if (!semver.gte(currentVersion, lowestVersion)) {
throw new Error(colors.red(`xuven-cli-dev 需要安装 v${lowestVersion} 以上版本的 Node.js`));
}
}

function checkPkgVersion() {
log.info('cli', pkg.version);
}

这样,我们即可以在其它目录下或其它库下读取到 process.env 配置了


Lerna脚手架搭建(十二):环境变量检查功能开发
https://blog.xuven.xyz/post/EnvironmentVariableCheck/
作者
Xuven Li
发布于
2022年4月18日
许可协议