dotenv
1. dotenv
dotenv 是一个用于管理环境变量的工具,广泛应用于各种编程语言和框架中。
它的主要功能是从一个 .env 文件中加载环境变量到应用程序的环境中,从而简化配置管理并提高安全性。
以下是对 dotenv 的详细介绍。
2. 什么是 dotenv?
dotenv 是一个零依赖的模块,旨在将环境变量从 .env 文件加载到 process.env 中。
这个方法基于十二要素应用程序方法论,强调将配置与代码分离[1][2]。
3. 为什么使用 dotenv?
使用 dotenv 有以下几个主要原因:
- 简化配置管理:通过将配置存储在
.env文件中,可以轻松管理和修改配置,而无需更改代码。 - 提高安全性:将敏感信息(如 API 密钥、数据库连接字符串等)存储在
.env文件中,而不是硬编码在代码中,可以减少信息泄露的风险[2][3]。 - 环境一致性:确保在不同环境(如开发、测试、生产)中使用一致的配置,减少因配置差异导致的问题[4]。
3.1. 如何使用 dotenv?
3.1.1. 安装
在 Node.js 项目中,可以通过 npm 或 Yarn 安装 dotenv:
# 使用 npm 安装
npm install dotenv
# 使用 Yarn 安装
yarn add dotenv
在 Python 项目中,可以通过 pip 安装 python-dotenv:
pip install python-dotenv
3.1.2. 配置 .env 文件
在项目的根目录下创建一个 .env 文件,并在其中定义环境变量。
格式为 KEY=VALUE,例如:
# 数据库主机地址
DB_HOST=localhost
# 数据库用户名
DB_USER=root
# 数据库密码
DB_PASS=s1mpl3
3.1.3. 加载环境变量
在 Node.js 中,可以在应用程序的入口文件(如 app.js 或 index.js)中加载 dotenv:
// 加载 dotenv 模块
require('dotenv').config();
// 获取环境变量
const dbHost = process.env.DB_HOST;
const dbUser = process.env.DB_USER;
const dbPass = process.env.DB_PASS;
// 输出环境变量
console.log(`数据库主机: ${dbHost}`);
console.log(`数据库用户: ${dbUser}`);
console.log(`数据库密码: ${dbPass}`);
在 Python 中,可以使用 python-dotenv 加载环境变量:
# 导入所需模块
from dotenv import load_dotenv
import os
# 加载 .env 文件中的环境变量
load_dotenv()
# 获取环境变量的值
db_host = os.getenv('DB_HOST')
db_user = os.getenv('DB_USER')
db_pass = os.getenv('DB_PASS')
# 输出环境变量
print(f"数据库主机: {db_host}")
print(f"数据库用户: {db_user}")
print(f"数据库密码: {db_pass}")
3.1.4. 进阶用法
3.1.4.1. 多环境支持
对于需要在不同环境(如开发、测试、生产)中使用不同配置的项目,可以创建多个 .env 文件(如 .env.development、.env.production),并在启动应用程序时指定使用哪个文件[6]。
例如,在 Node.js 中,可以使用 dotenv-cli 或 cross-env 来实现:
# 安装 dotenv-cli
npm install -g dotenv-cli
# 使用 dotenv-cli 指定 .env 文件
dotenv -e .env.development -- node index.js
在 Python 项目中,可以手动指定加载的 .env 文件:
# app.py 文件内容
# 导入所需模块
from dotenv import load_dotenv
import os
# 根据环境加载不同的 .env 文件
env_file = '.env.development' if os.getenv('ENV') == 'development' else '.env.production'
load_dotenv(env_file)
# 获取环境变量的值
db_host = os.getenv('DB_HOST')
db_user = os.getenv('DB_USER')
db_pass = os.getenv('DB_PASS')
# 输出环境变量
print(f"数据库主机: {db_host}")
print(f"数据库用户: {db_user}")
print(f"数据库密码: {db_pass}")
3.1.5. 安全性措施
为了确保 .env 文件中的敏感信息不被泄露,通常会将 .env 文件添加到 .gitignore 中,避免其被提交到版本控制系统中。
同时,可以创建一个 .env.example 文件,列出所有需要的环境变量,但不包含实际的值,供团队成员参考[7]。
4. 图表辅助理解
以下是一个简单的图表,展示了 dotenv 的工作流程:
+-----------------+ +-----------------+
| .env 文件 | | 应用程序入口文件 |
|-----------------| |-----------------|
| DB_HOST=localhost| | require('dotenv').config() |
| DB_USER=root | ----> | console.log(process.env.DB_HOST) |
| DB_PASS=s1mpl3 | | console.log(process.env.DB_USER) |
+-----------------+ +-----------------+
5. 实操案例
5.1. 案例一:Node.js 项目中使用 dotenv
5.1.1. 创建项目
mkdir my-node-app
cd my-node-app
npm init -y
5.1.2. 安装 dotenv
npm install dotenv
5.1.3. 创建 .env 文件
# .env 文件内容
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
5.1.4. 编写代码
// index.js 文件内容
// 加载 dotenv 模块
require('dotenv').config();
// 获取环境变量
const dbHost = process.env.DB_HOST;
const dbUser = process.env.DB_USER;
const dbPass = process.env.DB_PASS;
// 输出环境变量
console.log(`数据库主机: ${dbHost}`);
console.log(`数据库用户: ${dbUser}`);
console.log(`数据库密码: ${dbPass}`);
5.1.5. 运行代码
node index.js
你应该会看到如下输出:
数据库主机: localhost
数据库用户: root
数据库密码: s1mpl3
5.2. 案例二:Python 项目中使用 python-dotenv
5.2.1. 创建项目
mkdir my-python-app
cd my-python-app
5.2.2. 安装 python-dotenv
pip install python-dotenv
5.2.3. 创建 .env 文件
# .env 文件内容
DB_HOST=localhost
DB_USER=root
DB_PASS=s1mpl3
5.2.4. 编写代码
# app.py 文件内容
# 导入所需模块
from dotenv import load_dotenv
import os
# 加载 .env 文件中的环境变量
load_dotenv()
# 获取环境变量的值
db_host = os.getenv('DB_HOST')
db_user = os.getenv('DB_USER')
db_pass = os.getenv('DB_PASS')
# 输出环境变量
print(f"数据库主机: {db_host}")
print(f"数据库用户: {db_user}")
print(f"数据库密码: {db_pass}")
5.2.5. 运行代码
python app.py
你应该会看到如下输出:
数据库主机: localhost
数据库用户: root
数据库密码: s1mpl3
5.3. 案例三:多环境配置
5.3.1. 创建多个 .env 文件
# .env.development 文件内容
DB_HOST=localhost
DB_USER=dev_user
DB_PASS=dev_pass
# .env.production 文件内容
DB_HOST=prod-db-server
DB_USER=prod_user
DB_PASS=prod_pass
5.3.2. 修改代码以支持多环境
在 Node.js 项目中,可以使用 dotenv-cli 来支持多环境:
npm install -g dotenv-cli
修改 package.json 文件,添加以下脚本:
"scripts": {
"start:dev": "dotenv -e .env.development -- node index.js",
"start:prod": "dotenv -e .env.production -- node index.js"
}
在 Python 项目中,可以手动指定加载的 .env 文件:
# app.py 文件内容
# 导入所需模块
from dotenv import load_dotenv
import os
# 根据环境加载不同的 .env 文件
env_file = '.env.development' if os.getenv('ENV') == 'development' else '.env.production'
load_dotenv(env_file)
# 获取环境变量的值
db_host = os.getenv('DB_HOST')
db_user = os.getenv('DB_USER')
db_pass = os.getenv('DB_PASS')
# 输出环境变量
print(f"数据库主机: {db_host}")
print(f"数据库用户: {db_user}")
print(f"数据库密码: {db_pass}")
5.3.3. 运行代码
在 Node.js 项目中,运行以下命令:
npm run start:dev # 使用开发环境配置
npm run start:prod # 使用生产环境配置
在 Python 项目中,运行以下命令:
ENV=development python app.py # 使用开发环境配置
ENV=production python app.py # 使用生产环境配置
6. 总结
dotenv 是一个简单而强大的工具,能够显著简化环境变量的管理,提高应用程序的安全性和可维护性。
[1] https://juejin.cn/post/7080544982574039054
[2] https://juejin.cn/post/7103626431439044621
[3] https://cloud.tencent.com/developer/information/node.js中需要(‘dotenv’).config()
[4] https://juejin.cn/post/7233024572035366967
[5] https://blog.csdn.net/qq_51574759/article/details/131496233
[6] https://zyq190308.github.io/other/dotenv.html
[7] https://blog.csdn.net/gitblog_00038/article/details/136799887
[9] https://www.linuxcool.com/ghewjylymjxe
[10] https://github.com/apachecn/zetcode-zh/blob/master/docs/js/57.md
[11] https://ruizer.github.io/blog/note/node/process-env.html
[12] https://blog.51cto.com/u_12204/6521852
[13] https://developer.aliyun.com/article/1007175
[14] https://juejin.cn/post/6993224664705138702
[15] https://www.xiaoqiang.tech/2019/04/01/nodejs项目,从-env文件加载环境变量/
[16] https://blog.csdn.net/wanzheng_96/article/details/106753209
[17] https://www.cnblogs.com/shiwei1930/p/11847988.html
[18] https://segmentfault.com/a/1190000045220465
[19] https://www.django.cn/forum/forum-38438.html
[20] https://www.51cto.com/article/701690.html
[21] https://blog.csdn.net/sexyluna/article/details/130773428
[22] https://blog.csdn.net/walkskyer/article/details/135083475
[23] https://www.51cto.com/article/764747.html
[24] https://sugarat.top/technology/learn/loadEnv.html
[25] https://www.cnblogs.com/Chenjiabing/p/13968781.html
[26] https://www.cnblogs.com/zuiyixin/p/17699573.html
[27] https://foofish.net/python-dotenv.html
[28] https://developer.aliyun.com/article/1191665
[29] https://www.cnblogs.com/lyhero11/p/18361167
[30] https://www.miaoyurun.com/SpringBoot/SpringBoot Profiles 多环境配置及切换.html
[31] https://developer.aliyun.com/article/1392216
[32] https://juejin.cn/post/7231130096336289849
[33] https://cloud.tencent.com/developer/article/2410962
[34] https://www.cnblogs.com/muyang99/p/15966029.html
[35] https://www.youtube.com/watch?v=aVg8pZ72frM
[36] https://developer.aliyun.com/article/1008355
[37] https://blog.csdn.net/weixin_44834205/article/details/127635253
[38] https://www.cnblogs.com/tkuang/p/16127388.html
[39] https://juejin.cn/post/7130893625051283464
[40] https://blog.csdn.net/yujun2023/article/details/130821369
[41] https://www.herodotus.cn/guide/backend/profile-design.html
[42] https://cloud.tencent.com/developer/article/1957688
[43] https://spring.hhui.top/spring-blog/2022/04/25/220425-SpringBoot系列之基于maven多环境配置/