OpenCode 插件,自动加载项目环境变量并注入到 shell 子进程。
插件通过 OpenCode 的 shell.env 钩子工作。每次 OpenCode 启动 shell 子进程前,插件从当前工作目录的 .opencode/env-loader/ 扫描所有文件,按文件名排序后逐个解析为 KEY=VALUE,合并所有变量注入到 shell 环境。
- 后读覆盖先读(按文件名字典序)
- 文件命名无限制(命名只是 skill 生成时为人类可读性而设)
- 不再需要拦截命令或维护白名单
在 opencode.json 中注册插件:
{
"plugin": ["opencode-env-loader"]
}插件不接受任何配置参数。所有项目级 env 文件都从 .opencode/env-loader/ 目录下读取。
每个文件是纯 KEY=VALUE 格式,每行一个变量:
- 空行和
#开头的注释行会被忽略 - 支持
$VAR和${VAR}引用(运行时从process.env展开) - 变量名仅支持
A-Z、0-9、_,且不能以数字开头 - 支持同文件内
$VAR/${VAR}引用:先定义的变量会被后续行展开(递归展开,循环引用返回空串) - 文件中未匹配的变量回退到
process.env查找 - 循环引用(如
A=$B+B=$A)返回空串,不会无限递归
文件命名无限制。常见命名约定(仅供人类辨识,插件对所有文件一视同仁):
.java-env— Java / JVM 工具链.node-env— Node.js.python-env— Python.go-env— Godatabase.conf— 数据库相关变量secrets.env— 密钥类
Java 示例(.opencode/env-loader/.java-env):
# SDKMAN 配置
JAVA_HOME=$HOME/.sdkman/candidates/java/17.0.18-tem
PATH=$JAVA_HOME/bin:$PATHPython 示例(.opencode/env-loader/.python-env):
# pyenv 配置
PATH=$HOME/.pyenv/versions/3.12.0/bin:$PATHNode 示例(.opencode/env-loader/.node-env):
# fnm 配置
PATH=$HOME/.fnm/current/bin:$PATHGo 示例(.opencode/env-loader/.go-env):
# goenv 配置
GOROOT=$HOME/.goenv/versions/1.22.0
PATH=$HOME/.goenv/versions/1.22.0/bin:$PATH任意命名的自定义文件(.opencode/env-loader/database.conf):
DB_HOST=localhost
DB_PORT=5432插件自带一个 project-env-init Skill,可以自动为项目生成 .opencode/env-loader/ 下的 env 文件。
在 OpenCode 中运行:
/skill project-env-init
Skill 会:
- 自动检测项目语言(通过
pom.xml/package.json/pyproject.toml/go.mod) - 检测本地已安装的版本管理器
- 列出本地可用版本供你选择
- 提取环境变量差异
- 生成对应的
.opencode/env-loader/.java-env(或对应语言)文件
- 不支持 shell alias 和 function(纯
KEY=VALUE格式) - 不支持
unset语句(无法删除环境变量) - 不支持 Windows 平台
- 仅扫描
cwd/.opencode/env-loader/,不向上 walk-up - 不支持 v2.0.0 旧版格式(旧文件直接放
.opencode/.{java,node,...}-env会被忽略)
npm test项目使用 Vitest 运行测试,覆盖解析器、hook 和端到端场景。
MIT