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.2- 安装

在 Node.js 项目中,可以通过 npm 或 Yarn 安装 dotenv:

# 使用 npm 安装
npm install dotenv

# 使用 Yarn 安装
yarn add dotenv

在 Python 项目中,可以通过 pip 安装 python-dotenv:

pip install python-dotenv

3.3- 配置 .env 文件

在项目的根目录下创建一个 .env 文件,并在其中定义环境变量。格式为 KEY=VALUE,例如:

# 数据库主机地址
DB_HOST=localhost
# 数据库用户名
DB_USER=root
# 数据库密码
DB_PASS=s1mpl3

3.4- 加载环境变量

在 Node.js 中,可以在应用程序的入口文件(如 app.jsindex.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.5- 进阶用法

5.1.1.1- 多环境支持

对于需要在不同环境(如开发、测试、生产)中使用不同配置的项目,可以创建多个 .env 文件(如 .env.development.env.production),并在启动应用程序时指定使用哪个文件[6]。

例如,在 Node.js 中,可以使用 dotenv-clicross-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.6- 安全性措施

为了确保 .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

[8] https://www.freecodecamp.org/chinese/news/how-to-use-node-environment-variables-with-a-dotenv-file-for-node-js-and-npm/

[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多环境配置/