关于 EnvSync-LE
EnvSync-LE 比较多个 dotenv 文件中的变量名,并报告缺失或多余的键;它不读取值,也不修改文件。该工具面向 VS Code 系编辑器、终端、CI 和支持 MCP 的 Agent。
主要功能
- 01以自动、手动或模板模式比较 dotenv 键
- 02监视文件变更并自动检查
- 03状态栏问题计数和 Markdown 报告
- 04为终端或 CI 提供 CLI 输出及退出码
- 05MCP 工具接收文件内容而非路径
适用场景
- 01在部署前发现缺失的环境变量键
- 02在 CI 中检查 dotenv 文件一致性
- 03让 Agent 比较提供的 dotenv 内容而不暴露值
MCP 相关
stdio MCP 服务提供 `compare_env_files`,接收文件内容并返回缺失或多余的键名。它不会读取文件或发起网络请求。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
1收录的工具列表 · 更新于 3 天前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| mode | enum | 否 | "auto" 会与所有键的并集进行比较;"template" 会与一个文件进行比较。auto | template |
| files | array | 是 | 要比较的 dotenv 文件。 |
| maxResults | integer | 否 | 返回的键不匹配项上限(默认 500)。meta.truncated 报告是否有结果被省略。 |
| templatePath | string | 否 | 指定哪个文件是模板。mode 为 "template" 时必填。 |
| caseSensitive | boolean | 否 | 比较键名时是否区分大小写。 |
详细介绍
EnvSync-LE:轻松同步 .env
在 .env 文件中找出缺失的键,避免问题发生
自动检查、状态栏计数器,以及简洁的 Markdown 报告
觉得有用? 点赞或评分能帮助其他开发者发现它 — ★ GitHub · ★ Open VSX · ★ Marketplace
功能介绍
EnvSync-LE 会比较工作区中 .env 文件的变量名,并指出哪些文件缺少哪些键。它绝不会读取或比较变量值,也不会修改你的文件。支持 VS Code 及基于 VS Code 的编辑器,例如 Cursor 和 VSCodium(可从 Open VSX 安装)。
- 自动检查 — 每当受监视的
.env文件发生变化,都会运行防抖同步检查 - 状态栏计数器 — 显示当前问题数量,单击即可查看完整报告
- Markdown 报告 —
Show Details会列出每个文件缺少的所有键 - 三种比较模式 —
auto(所有键的并集)、manual(仅比较你列出的文件)、template(根据一个参考文件验证所有内容;也会报告文件中存在但模板中缺少的键) - 忽略列表 — 暂时排除文件(例如
.env.example),不对其进行检查
安装
| 位置 | 可获得的功能 | 安装方式 |
|---|---|---|
| VS Code | 在编辑器中实时进行相同的比较 | Marketplace |
| Cursor、VSCodium、Windsurf | 相同的扩展 | Open VSX |
| 终端或 CI 步骤 | 对整个目录树执行相同的检查,并返回退出代码 | npx envsync-le · npm 或 cargo install envsync-le · crates.io |
| 任何 MCP Agent,通过 Node | 通过标准输入输出调用 compare_env_files | npx envsync-le-mcp · npm |
在 AI Agent 中使用
同一引擎也可作为 MCP 服务运行,因此 Agent 可以直接调用它,而不必由你运行命令。
| 编辑器 | 方法 |
|---|---|
| VS Code 1.101+ | 无需安装 — 扩展会在 Agent 模式下注册 compare_env_files |
| Claude Code | claude mcp add envsync-le -- npx -y envsync-le-mcp |
| Cursor、Windsurf 及其他工具 | 将其指向 npx envsync-le-mcp |
compare_env_files(files[], mode?, templatePath?, caseSensitive?, maxResults?)
直接接收文件内容,并报告哪些文件缺少哪些键。只返回键名,绝不返回值 — dotenv 文件存放着凭据,而回答并不需要这些值。
该服务接收内容并返回数据 — 不会读取任何文件,也不会自行发出网络请求。它以 envsync-le-mcp 的名称发布在 npm 上,并以 io.github.nolindnaidoo/envsync-le 的名称发布在 MCP 注册表中。
手动配置 — 适用于任何带 MCP 配置文件的宿主
大多数宿主会读取 JSON 配置。添加一个条目:
{
"mcpServers": {
"envsync-le": {
"command": "npx",
"args": ["-y", "envsync-le-mcp"]
}
}
}
-y 会跳过首次运行时的安装提示。如果不想跟踪版本更新,可以固定版本 — [email protected]。
不想每次启动都通过 npx 运行?可以安装一次,然后指向二进制文件:
npm install -g envsync-le-mcp
{
"mcpServers": {
"envsync-le": { "command": "envsync-le-mcp" }
}
}
它通过 stdio 使用 MCP,无需环境变量、API 密钥,也无需自行配置。将其接入任何工具前,可以先检查:
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | npx -y envsync-le-mcp
这会打印工具列表并退出 — 如果看到 compare_env_files,就说明服务运行正常。
文件分类
| 文件名 | 类型 |
|---|---|
.env | 基础 |
.env.local、.env.*.local | 本地覆盖 |
.env.example、.env.template | 模板 |
.env.production、.env.prod | 生产环境 |
.env.development、.env.dev | 开发环境 |
.env.test | 测试 |
anything.env、未知片段 | 基础 |
分类依据基名中的片段 — app.device.env 不属于
“开发环境”,且 Windows 路径也能正确分类。
命令行工具
同一比较功能也可在终端或 CI 步骤中运行:Rust 命令行工具位于
crate/,与扩展共享一个样本集 —
crate/fixtures/ — 因此两者读取 dotenv 文件的方式
绝不会不同。
可以通过 npm 安装:npm install -g envsync-le(或使用
npx envsync-le 运行);也可以通过 crates.io 使用 cargo install envsync-le 安装。两种方式
安装的是同一条命令,输出也逐字节保持一致。
envsync-le . # have these environments drifted? JSON on stdout when piped
envsync-le --template .env.example . # will this deploy break?
envsync-le mcp # the same comparison over MCP on stdio
可从 npm (envsync-le) 或 crates.io 安装 (envsync-le)。两种方式安装的都是同一个 envsync-le 命令。
npm install -g envsync-le # or run it once: npx envsync-le
cargo install envsync-le
.env: missing STRIPE_KEY, SENTRY_DSN (in .env.example)
.env.production: missing SENTRY_DSN (in .env.example)
out of sync — 2 files with mismatches across 3 files
退出代码就是结果 — 同步时为 0,不同步时为 1,问题格式错误时为 2。 完全找不到 dotenv 文件时返回 0:没有任何文件可与之不同步。与此系列中的提取工具不同,它没有列表可供 继续传递;这个数字就是答案。
它绝不读取任何值。 只会解析、比较或 报告键名,并通过三项独立检查来确保这一点,而非仅作承诺。
命令
| 命令 | 描述 |
|---|---|
EnvSync-LE: Show Details | 运行同步检查并打开 Markdown 报告 |
EnvSync-LE: Compare Files | 比较两个或更多所选 .env 文件的键集合 |
EnvSync-LE: Set Template | 将 .env 文件设为参考模板 |
EnvSync-LE: Clear Template | 恢复自动比较 |
EnvSync-LE: Ignore File | 将 .env 文件排除在同步检查之外 |
EnvSync-LE: Unignore File | 重新纳入之前忽略的文件 |
EnvSync-LE: Clear Ignored Files | 清空忽略列表 |
EnvSync-LE: Open Settings | 打开筛选为 EnvSync-LE 设置的 VS Code 设置 |
EnvSync-LE: Help & Troubleshooting | 内置文档 |
默认情况下,没有命令绑定快捷键。可在编辑器的 键盘快捷方式 中为任意命令绑定快捷键。
设置
| 设置 | 默认值 | 描述 |
|---|---|---|
envsync-le.enabled | true | 同步检查总开关 |
envsync-le.watchPatterns | [".env*"] | 要监视和比较的文件的 Glob 模式 |
envsync-le.excludePatterns | [] | 要排除的 Glob 模式;不含 / 的模式匹配基本文件名(因此 .env.*.local 也会排除嵌套文件) |
envsync-le.notificationLevel | important | all = 缺失键 + 额外键,important = 缺失键 + 错误,silent = 不显示任何内容 |
envsync-le.statusBar.enabled | true | 显示状态栏项(立即生效) |
envsync-le.debounceMs | 1000 | 文件更改后到运行同步检查的延迟时间 |
envsync-le.caseSensitive | true | 将 DB_URL 和 db_url 视为不同的键 |
envsync-le.comparisonMode | auto | auto、manual 或 template |
envsync-le.compareOnlyFiles | [] | 在手动模式下,只比较这些文件(相对于工作区的路径) |
envsync-le.templateFile | — | 模板模式的参考文件(通过 Set Template 设置) |
envsync-le.temporaryIgnore | [] | 当前忽略的文件(由忽略命令管理) |
envsync-le.telemetryEnabled | false | 仅本地的事件日志(参见“隐私”) |
解析说明
- 键必须匹配
[A-Za-z_][A-Za-z0-9_.-]*,因此spring.datasource.url这类带点的名称也有效;=左侧的任何其他内容都会被报告为该行的解析错误(文件其余部分仍会计入)。 - 接受
export KEY=value;重复的键只计一次。 - 用
"、'或`引起来的值可以跨越多行;未闭合的引号会被报告为错误。 - 在
auto模式下,参考键集合是所有键的并集,因此只有在template模式下才会出现“额外键”。
语言
除英语外,还有十二种语言:
德语 · 西班牙语 · 法语 · 印度尼西亚语 · 意大利语 · 日语 · 韩语 · 葡萄牙语(巴西)· 俄语 · 乌克兰语 · 越南语 · 简体中文
两个部分都已翻译:清单(命令标题、设置名称和描述),以及扩展运行时显示的所有内容(通知、状态栏、快速选择和提示词,以及报告标题)。帮助页面以英语编写。扩展会遵循 VS Code 的显示语言,因此会与编辑器当前设置的语言一致;扩展本身没有单独的语言设置。
隐私与安全
- 不访问网络。 此扩展绝不会向任何地方发送数据。
telemetryEnabled设置只会将事件写入本地输出通道,供你查看(envsync-le)。 - 绝不会读取、显示或记录值——只比较键名。
- MCP 服务只返回键名,绝不返回值。 凭证存放在 dotenv 文件中,因此服务只报告缺少或多余的键,不会透露其内容。它将文件内容作为参数,而非路径,因此不会读取任何文件,也不会发起网络调用;打包门禁会断言响应中不含已知值。
- 错误通知会对主目录和类似凭证的片段进行脱敏。
- 评分提示最多出现两次。 第 3 次成功使用时,扩展会询问你是否愿意评分;如果你选择了 稍后 或将其关闭,则会在第 20 次使用时再询问一次。选择 不再询问 后便不会再提示。你自行将
notificationLevel设置为important或silent,也会关闭此提示。计数保存在 VS Code 的扩展存储中,不会向任何地方发送数据;点击 评分 会在浏览器中打开你安装时使用的发布平台页面——VS Code Marketplace 或 Open VSX。
文档
| 内容 | 位置 |
|---|---|
| 此工具可以说什么——范围、输出约定、拒绝事项、非目标 | crate/SPEC.md |
| 扩展的构建与内部机制——架构、不变量、工具链、发布 | AGENTS.md |
| CLI 的构建与内部机制 | crate/AGENTS.md |
| 变更内容 | CHANGELOG.md · crate/CHANGELOG.md |
| 此工具的页面及其他 15 个工具 | letools.dev/tools/envsync-le |
性能
| 输入 | 大小 | 找到 | 耗时 | 速率 | 扫描速度 |
|---|---|---|---|---|---|
| 4 个文件 x 500 个键 | 0.02 MB | 1,910 | 0.29 ms | 6,690,018/秒 | 63.2 MB/s |
| 24 个文件 x 500 个键 | 0.11 MB | 11,103 | 1.11 ms | 9,994,077/秒 | 94.5 MB/s |
| 4 个文件 x 8,000 个键 | 0.32 MB | 31,172 | 2.04 ms | 15,279,763/秒 | 158.4 MB/s |
预热后运行 7 次取中位数,测试环境为 Apple M5 Pro、24 GB RAM、Node 24.3.0。输入由 scripts/benchmark.ts 生成,而非签入仓库,因此上述大小与实际测量值完全一致。运行 bun run benchmark 可复现。
这些数据因机器而异,不会在 CI 中断言——会阻止构建的基准测试,只能说明运行器当时有多忙。
测试
| 指标 | 覆盖率 |
|---|---|
| 语句 | 90.09% |
| 分支 | 83.89% |
| 函数 | 91.86% |
| 行 | 91.51% |
28 个文件中共有 353 个测试用例,此外还有一个在真实 VS Code 扩展宿主中运行的集成测试套件,以及一个将构建好的 .vsix 安装到全新配置文件中的端到端测试。
数据由 scripts/coverage-readme.js 根据真实运行生成——文件为 coverage/coverage-summary.json 和 coverage/test-results.json;如果此部分内容有偏差,CI 会失败。运行 bun run test:coverage 可复现,用例数以 vitest 打印的结果为准。
LE 系列的更多工具
为每个模型眼前的工作打造的 16 款单一用途工具。每款都附带一个 Rust CLI 和一个 MCP 服务。一页尽览:letools.dev
提取
- String-LE — 提取代码库中的所有字符串,方便人工阅读
- Numbers-LE — 提取代码库中所有硬编码数字,方便人工检查
- Units-LE — 提取所有带单位的数量并统一格式,遇到含义不明确的数量时会按名称拒绝处理
- Dates-LE — 提取所有日期和时间戳,并给出每个日期和时间戳解析出的确切时刻
- IDs-LE — 提取所有 UUID、ULID、NanoID、ObjectId 和 Snowflake,并解码其中的时间
- IPs-LE — 提取所有 IP 地址、CIDR 网段和 MAC 地址,统一格式并按范围分类
- URLs-LE — 提取代码库中的所有 URL,并给出协议和确切位置
- Paths-LE — 提取代码库中的所有文件路径,并说明它们是否仍指向实际内容
- Colors-LE — 提取代码库中的所有颜色,并指出哪些颜色不在你的调色板中
检查
- Regex-LE — 查找代码库中的所有正则表达式,并报告哪些可能导致灾难性回溯
- Versions-LE — 查找某个依赖项在仓库的各个清单文件中受到不同约束的位置
- i18n-LE — 识别项目使用的 i18n 库,然后依据该库的规则审查其目录
- Scrape-LE — 在编写抓取器之前检查网页能否抓取,并说明何时无法判断
防护
- Secrets-LE — 查找代码库中的硬编码凭据,绝不在报告中打印凭据
- EnvSync-LE — 比较目录树中的 dotenv 文件,并指出哪些文件缺少哪些键
- Unicode-LE — 查找那些隐藏含义的 Unicode 字符——双向控制字符、不可见字符、同形异义字符、混合文字系统
每款工具都独立运行:没有共享的 crate,也没有发布的核心库。若有两款工具得出相同结论,那是因为这个答案经得起两次验证。
联系 — nolindnaidoo.com · GitHub · LinkedIn
nolindnaidoo 的其他项目
Rust — pixelcoords 和 pixelactions 构成一个工作循环:pixelcoords 回答 位置,pixelactions 在那里执行操作。它们有各自的工具、各自的风格——不属于 LE 系列。
- pixelcoords — 冻结屏幕,标记区域,获取像素级精确的坐标和裁剪图像 pixelcoords.dev · crates.io · docs.rs
- pixelactions — 使用经过人工验证的坐标执行交互,并确认操作已生效 pixelactions.dev · crates.io · docs.rs
许可证
MIT © nolindnaidoo
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。