本文最后更新于:2024年12月10日 下午
一、安装 detenv 库 👈
- 在
core/cli/
目录下,执行命令 cnpm i -S detenv
安装 dotenv 库;
二、获取环境变量 👈
-
编辑 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); }
|
-
执行 xuven-cli-dev --debug
命令,发现报错,找不到文件或文件夹;
-
编辑 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); } ...
|
-
执行 xuven-cli-dev --debug
命令,发现报错,没有权限(我这里用的是 root 账户);
-
注释 core/cli/lib/index.js
文件内的 rootCheck();
行,再次执行,输出:
-
由于我们没有判断 .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); } ...
|
-
编辑 ~/.env
,内容如下:
1 2 3
| CLI_HOME=.xuven-cli DB_USER=root DB_PWD=123456
|
-
再次执行 xuven-cli-dev --debug
命令,输出如下:
-
再次编辑 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); }
|
-
再次执行 xuven-cli-dev --debug
命令,输出如下:
由此可见,配置文件里的参数已加入到 process.env
内。
-
因此,我们只需如下配置即可:
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
内没有环境变量,我们则需要配置默认的环境变量,这里有两种方案可以配置环境变量,推荐第二种方案。
方案一
-
编辑 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, }
|
-
编辑 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'); }
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); }
|
-
再次执行 xuven-cli-dev --debug
命令,输出如下:
方案二
-
编辑 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'); }
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
配置了