Skip to main content

Dotenvx完善Python和Node.js的支持,让.env加密特性使用更简单

· 6 min read
Libing Chen
Java程序员,兼全栈、Rust和AI开发

.env文件在Node.js和Python等语言中被广泛使用,主要用于存储应用程序的配置参数,如数据库连接信息、API密钥等。 目前dotenvx已经支持这些语言的SDK,可以非常方便地集成dotenvx的加密特性,但是这种方式还是有一些不便之处, 如会让Node.js和Python的项目增加额外的依赖包,导致应用变大,内存消耗增加,这点对Node.js尤为明显, 为了解密一个.env文件,然后加载为环境变,但是要付出这么多的代价,似乎不太划算。 此外做一些demo项目时,也有些偷懒,还需要增加额外的开发包,还是觉得有点麻烦,那么能否有一种更简单的方式呢?

这个可能就要从语言的SDK着手啦,能否让语言SDK天生就支持dotenvx特性呢?就像一些SDK,天生就支持.env一样,这样岂不是更方便一些。 那么能否做到让语言SDK天生支持dotenvx呢?从语言层面来说,可能有点麻烦,但是我们可以通过外部的管理工具做到这一点。

目前来说,Python的项目管理工具为uv,不但可以管理Python SDK,虚拟环境,开发包等,基本上涵盖了Python项目的方方面面, 可以说uv是Python社区标准的项目工具。 Node.js也有相关的SDK工具,那就是Volta,Volta可以管理Node.js的版本,工具等。 接下来我们就看一下如何结合uv和Volta来实现让Python和Node.js天生支持dotenvx特性。

Python SDK和Dotenvx集成

首先看一下Python的场景,uv会创建一个虚拟的Python环境,对应的目录为.venv, 该目录下的bin/python就是Python的解析器,当然该命令行其实是一个软连接,指向具体的Python版本目录下的解析器。 如$HOME/.local/share/uv/python/cpython-3.13.7-macos-x86_64-none/bin/python3.13,所以要做的工作就是替换.venv/bin/python这个软连接, 调整为一个wrapper脚本,但是还会保留原先的Python解析器的能力,如Debug等功能都不受影响。让我们看一下对应的wrapper脚本内容:

#!/bin/bash

# load .env by dotenvx
eval $( dotenvx decrypt --stdout --format shell )
# Execute python3 command with arguments
exec $HOME/.local/share/uv/python/cpython-3.13.7-macos-x86_64-none/bin/python3.13 "$@"

上述脚本中,dotenvx会加载.env文件,包括对应的解密工作,然后将解密后的变量加载到环境变量中, 最后就是执行具体的Python命令,这样就完成了Python和dotenvx的集成。

Tips: 在最新的Dotenvx版本中,你只需要执行dotenvx link .venv/bin/python,就会自动创建对应的wrapper脚本,省去了手动创建的麻烦。

通过该方式,Python解析器不受任何影响,执行python demo.py,和IDE集成等,完全没有任何问题,你可以直接将该脚本理解为软连接即可。

Node.js SDK和Dotenvx集成

接下来我们看一下Node.js的场景,Volta管理Node.js多版本和工具,都是通过一个shim工具来实现的,也就是$HOME/.volta/bin/volta-shim命令, 然后会会创建一个node的软连接,指向$HOME/.volta/bin/volta-shim,在执行node命令时,实际上是执行的volta-shim命令, volta-shim会根据当前目录的package.json文件,来决定使用哪个版本的Node.js,然后再执行对应版本的Node.js解析器。

接下来我们要做的工作就是让volta-shim支持dotenvx特性,这样就可以让Node.js天生支持dotenvx特性了。 Volta是用Rust语言编写的, Dotenvx的命令行也是用Rust编写的,所以我们只需要在volta-shim中调用dotenvx-rs的API即可, 也就是一行代码的事:dotenvx_rs::dotenv().ok();,这样就可以加载.env文件了,然后再执行对应版本的Node.js解析器即可。

让我们看一下具体的操作。 首先安装Volta, 然后下载Volta Dotenvx Edition, 覆盖$HOME/.volta/bin/下的命令行即可。

注意: 使用Mac的同学可能要执行一下sudo xattr -r -d com.apple.quarantine volta*解除安全隔离。 Tips: Volta当前维护没有那么活跃,所以我也merge了社区的一些特性,并修复了一些小的bug,大家可以放心使用。

接下来执行node命令时,就会自动加载.env文件,然后再执行对应版本的Node.js解析器,这样就完成了Node.js和dotenvx的集成。

如果你没有安装Volta,还是想用Node.js和dotenvx集成,也可以创建一个nodew的脚本,由改脚本负责调用dotenvx加载.env文件, 然后再调用具体的Node.js解析器即可,如/usr/local/bin/nodew,样例脚本如下:

#!/bin/bash

# load .env by dotenvx
eval $( dotenvx decrypt --stdout --format shell )
# Execute node command with arguments
exec /usr/local/Cellar/node/24.7.0/bin/node "$@"

然后在VS Code或WebStorm将Node.js的解析器设置为/usr/local/bin/nodew即可。

如果是Bun或者Deno,你可以创建一个bunw或者denow的脚本,由改脚本负责调用dotenvx加载.env文件,然后再调用具体的Bun或者Deno解析器即可。 样例脚本如下:

#!/bin/bash

# load .env by dotenvx
eval $( dotenvx decrypt --stdout --format shell )
# Execute bun command with arguments
exec $HOME/.bun/bin/bun "$@"
#exec $HOME/.deno/bin/deno "$@"

总结

借助uv和Volta,我们可以非常方便地让Python和Node.js天生支持dotenvx特性, 这样就不需要在项目中增加额外的依赖包,导致应用变大,内存消耗增加的问题,关键是非常简单方便。

大家不用担性能的问题,dotenvx-rs非常轻量,速度也非常快,基本上可以忽略不计,你在生成环境中使用,也是完全没有问题的。