Skip to main content

其他编程语言集成dotenvx

当然dotenvx并不能提供所有编程语言的SDK,如果你使用的编程语言还没有对应的dotenvx SDK,那么你可以使用以下方式进行集成。

dotenvx decrypt --dump命令可以执行解密,并将解密的配置项以json格式打印到标准输出(stdout),这样其他语言可以构建对应的命令行, 然后执行该命令行就可以得到输出,然后解析输出的json即可。 这里需要两个环境变量

  • DOTENV_PRIVATE_KEY=xxxx:对应解密的私钥
  • NO_COLOR=1:设置为1,表示不使用颜色输出

这里你不用担心,dotenvx命令行使用Rust开发,非常小(3M左右),执行速度也非常快,所以可以放心使用。

这里我们就举一个例子,如Ruby和Dotenvx集成,你只需要一个简单的AI提示词,就可以创建对应的代码。 提示词:

Ruby language: please create a function `dotenvx_load?`,  to run command line `dotenvx decrypt --dump`, 
capture the stdout json , parse the stdout json as Hash object and inject all key/value from the hashmap as envrionment variables.

Claude Sonnet 4输出的代码:

require 'json'
require 'open3'

def dotenvx_load?
begin
# Run the dotenvx decrypt --dump command and capture stdout
stdout, stderr, status = Open3.capture3('/Users/linux_china/.cargo/bin/dotenvx decrypt --dump')

# Check if the command executed successfully
unless status.success?
warn "dotenvx command failed: #{stderr}"
return false
end

# Parse the JSON output
env_hash = JSON.parse(stdout)

# Inject each key-value pair as environment variables
env_hash.each do |key, value|
ENV[key] = value.to_s
end

true
rescue JSON::ParserError => e
warn "Failed to parse JSON output: #{e.message}"
false
rescue Errno::ENOENT => e
warn "dotenvx command not found: #{e.message}"
false
rescue StandardError => e
warn "Error loading dotenvx: #{e.message}"
false
end
end

# Usage example
if dotenvx_load?
puts "Environment variables loaded successfully"
puts ENV["NICK"]
else
puts "Failed to load environment variables"
end

语言SDK集成

通过语言SDK调用dotenvx命令行方式集成也并不复杂,还有一种方式就是调整语言SDK命令行方式,这里以Python为例。 你使用uv来管理项目,Python对应的命令行为.venv/bin/python,该命令行其实是软连接到具体的Python版本目录下的, 如$HOME/.local/share/uv/python/cpython-3.13.7-macos-x86_64-none/bin/python3.13。 你可以创建一个shell脚本,名称为python,对应的代码如下:

#!/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 "$@"

然后使用该脚本覆盖原先的.venv/bin/python,这样你每次使用.venv/bin/python命令行时, 就会先调用dotenvx加载.env文件,然后再执行Python命令,这样就完成了.env文件的解密和环境变量的注入, 然后再执行python命令,这样就起到Python和dotenvx的集成,而其他的Python功能完全不受影响,如debug等。

借助该方式,你可以非常方便地集成其他编程语言,如lua, PHP, Perl等,你只需要创建执行器对应的wrapper脚本, 如luaw, phpw, perlw等,和Gradle的gradlew脚本类似,gradlew脚本负责环境检测、可能的gradle下载, 然后再执行具体的gradle命令。

Dotenvx之命令软连接

dotenvx link <command>命令可以创建命令软连接,这个是对原型的命令的封装。当你执行软连接命令式,其实是由Dotenvx命令行来执行的, 然后会加载配置文件,然后再执行原命令,这样就完成了对原命令的.env配置集成。

如你使用Bun SQL特性,你已经在.env中设置好了数据库连接信息,如下:

DATABASE_URL="mysql://root:this_is_long_password@localhost:3306/test"

你只需要执行dotenvx link bin/mysql,然后执行./bin/mysql,就可以登录配置项指定的MySQL数据库了, 同样的方式,你可以使用dotenvx link bin/psql,然后执行./bin/psql,就可以登录PostgreSQL数据库了。

借助这种软连接方式,你不需要修改任何命令和脚本,就可以轻松地集成dotenvx的.env配置,非常方便。

Dotenvx和DuckDB集成

DuckDB是一款非常流行的嵌入式OLTP数据库,已经受到非常多的开发人员喜欢,但是其Secret管理能力比较弱,没有提供完备的加密机制, 目前Dotenvx可以为DuckDB提供Secret的加密管理能力,让我们看一个样例。

你创建一个.env.duckdb文件,内容如下:

# secret example
DUCKDB__HTTP_SECRET=secret
DUCKDB__HTTP_SECRET__TYPE=http
DUCKDB__HTTP_SECRET__BEARER_TOKEN=xxxx

# database attach example
DUCKDB__SECRET_DB=attach
DUCKDB__SECRET_DB__TYPE=duckdb
DUCKDB__SECRET_DB__URL=encrypted.db
DUCKDB__SECRET_DB__ENCRYPTION_KEY=123456

从上述的代码中,我们采用__作为层级分隔符,这样就可以将复杂的结构体转换为环境变量, 详细的方法大家可以参考: Structured data in environment variables

所以DuckDB的secret的配置就可以从SQL方式转换为标准的配置项,结构如下:

DUCKDB__OBJECT_NAME=attach/secret
DUCKDB__OBJECT_NAME_TYPE=secret_type/db_type
DUCKDB__OBJECT_NAME_ATTRIBUTE_NAME=value

最后我们使用dotenvx link bin/duckdb创建DuckDB CLI的软链接,然后运行./bin/duckdb即可, Dotenvx就会自动加载.env.duckdb文件中的加密配置项,然后转换为SQL,然后通过--cmd sql参数传递给DuckDB CLI, 这样就完成了DuckDB的Secret的创建。

提示: 通过该方式创建的Secret是临时的,进程退出后就会丢失,而且也不会保存到$HOME/.duckdb_history 文件中,这样就避免了Secret泄露的问题。