尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

吾码 CLI 和 VS Code 插件一起用,会不会互相覆盖配置?我用并发写入和错版回归测了一遍

吾码 CLI 和 VS Code 插件一起用,会不会互相覆盖配置?我用并发写入和错版回归测了一遍 团队里很容易出现这样一种组合有人习惯在 VS Code 里看资源树、点按钮调试另一些人只开终端让 Codex CLI 直接修改接口引擎。两边连接的是同一套吾码环境也都要生成 MCP、Skills 和本地 V8 代码。真正让人不放心的不是“能不能同时安装”而是更具体的几件事CLI 新增服务器连接时会不会把插件保存的连接覆盖掉两个进程差不多同时写配置会不会只剩下最后一次写入旧版 CLI 会不会把新版插件生成的 MCP Server 路径降级初始化吾码 MCP 时会不会顺手删掉项目里别的 MCP我没有只看功能说明而是顺着当前源码把共享文件、写入方式和版本选择规则拆开又跑了并发写入与错版兼容回归。结论不复杂当前版本已经按“共享一份工作区状态”设计CLI 和插件可以交替使用但这不等于任何历史旧版本都天然安全也不等于同一个 V8 文件可以被两边同时随意改。它们共享的不是界面而是工作区事实吾码官网对本地 AI 开发的描述核心一直是把接口引擎、V8 事件、数据库结构和 AI 知识放到本地让 Copilot、Claude Code、Cursor 或 Codex 能理解真实业务上下文。VS Code 插件负责把这套能力做成可视化入口CLI 则把连接、登录、AI/MCP 初始化、拉取和差异检查放进命令行。当前实现里两边共用的关键内容包括Microi-V8-Engine/ ├─ .microi-config.json # 服务器连接 ├─ .microi-mcp-tokens.json # MCP 使用的 Token ├─ .microi-meta.json # 本地/远端同步基线 └─ 服务器/租户/... # 接口引擎和 V8 事件代码 .vscode/mcp.json # VS Code / Copilot .cursor/mcp.json # Cursor .mcp.json # Claude Code .codex/config.toml # Codex AGENTS.md、CLAUDE.md、microi.skills/这也是为什么“CLI 另存一套配置”看起来省事实际却会制造更难排查的问题同一服务器可能出现两份 Token、两套同步基线最后谁也说不清本地文件对应哪次远端状态。现在的方向是让不同入口操作同一份事实同时给写入加保护。版本不一致时最怕的其实不是报错很多兼容问题不会立刻抛异常。更隐蔽的一种情况是新版先在 JSON 里增加字段旧版随后读取旧版只认识原来的属性于是把对象重新序列化时新字段悄悄消失。命令仍然返回成功真正的问题可能到下次登录、切换网络环境或启动 MCP 时才暴露。例如新版 profile 可能是这样{label:生产环境,apiBaseUrl:https://api.example.com,osClient:demo,osClientType:Product,osClientNetwork:External,futureProfileField:keep-me}如果旧代码把它读进一个只有前三个字段的强类型对象再用这个对象覆盖原文件osClientType、osClientNetwork和未来字段都可能丢失。当前ServerProfile和工作区文档都允许保留未知键修改 profile 时是在现有对象上合并而不是从空白对象重建。回归测试还专门放入futureTopLevel和futureProfileField运行旧入口风格的更新以后再断言它们仍然存在。这类“前向兼容”比简单判断插件版本 CLI 版本更实用。版本完全一致当然最好但真实团队里总会有人晚几天更新工具。只要旧入口不删除自己不认识的数据新入口就还有恢复和升级的空间。第一层保护先锁住再重新读取最后原子替换最容易复现的是连接配置并发写入。ConfigManager不是先读取一次 JSON、修改内存对象、过几秒再直接覆盖而是按下面的顺序执行constlockPath${configPath}.lock;lockFdfs.openSync(lockPath,wx,0o600);// 独占创建constcurrentthis.readWorkspaceConfigForUpdate(configPath);constnextthis.normalizeSettings(mutation(current));consttempPath${configPath}.${process.pid}.${Date.now()}.tmp;fs.writeFileSync(tempPath,JSON.stringify(next,null,2));fs.renameSync(tempPath,configPath);// 同目录原子替换这里有三个细节值得保留拿到锁以后才重新读取当前文件避免第二个进程基于过期快照写回。写入走临时文件再rename进程中断时不容易留下半截 JSON。解析失败会停止写入并保留原文件而不是拿默认空配置覆盖损坏现场。锁等待有上限超过时间会提示“正在被 CLI 或 VS Code 插件修改”超过 30 秒的遗留锁可以恢复。它解决的是本机同一工作区里的短时竞争并不是数据库意义上的分布式锁。我运行的并发用例同时启动两个 CLI 进程分别向空工作区写入tenant-a和tenant-b。最终两个 profile 都存在目录里也没有残留.lock或.tmp文件。读者可以在安装 CLI 后做一个不连接真实服务器的最小复现$workJoin-Path$env:TEMPmicroi-coexist-demoNew-Item-ItemType Directory-Path$work-Force|Out-Null$jobs (Start-Job{param($w)microi profile add--api https://api-a.example.test--os-client tenant-a--label A--workspace$w}-ArgumentList$workStart-Job{param($w)microi profile add--api https://api-b.example.test--os-client tenant-b--label B--workspace$w}-ArgumentList$work)$jobs|Wait-Job|Receive-Jobmicroi profile list--workspace$work--json重点不是输出顺序而是最后能看到两个连接且.microi-config.json仍是完整 JSON。第二层保护旧工具不能随便“降级”新工具配置文件能写完整还不够。CLI 4.6.x 和插件 4.6.x 同时存在时谁应该提供 MCP Server当前代码会给生成的 MCP 记录来源和三段版本例如{MICROI_TOOL_SOURCE:cli,MICROI_TOOL_VERSION:4.6.3}合并时会同时比较稳定名称以及API URL OsClient形成的目标身份。若已有提供者版本更高较旧的一端跳过替换无关的 MCP 条目始终保留。测试里先放入99.0.0的模拟新版提供者再运行当前 CLI 的mcp init命令和版本都没有被降级项目中预置的other_tool也还在。AI 指令和 Skills 采用相似思路但判断依据不只是总版本号还包括 manifest 中的逐文件 hash。测试人为给AGENTS.md写入新版内容再让旧 bundle 初始化新增内容仍被保留。Token 文件的处理也不是整份重建。写入前会读取另一入口刚保存的键只删除当前连接明确管理的身份再合并新 Token。新版身份键包含 API、租户、产品类型和网络类型只有同一 API 与租户确实唯一时才兼容写旧版键减少多租户或内外网连接相互覆盖的风险。我觉得最重要的边界这套机制能解决“两个入口维护同一份配置”的大部分工程问题但有三条边界不能省略。第一已经发布出去的历史二进制不会被新源码隔空修复。microi doctor会把没有来源和版本记录的提供者显示为legacy。如果运行旧工具后发现 MCP 路径被改回去应在较新的一端重新执行microi doctor microi mcp init microi ai init第二配置共存不等于代码自动合并。CLI 和插件若同时修改同一个接口引擎文件仍然要先看同步差异microisyncstatus--scopeall--profile1确认是纯本地修改再推送服务器较新或双方都改过时应先拉取或人工合并。锁住.microi-config.json不能替代 V8 源码的三方比较。第三本次验证范围是当前源码和本机自动化测试并发 profile 写入通过CLI 的未知字段保留、非吾码 MCP 保留、新版提供者保护、损坏 JSON 失败关闭等用例通过。我没有在两个真实用户进程里同时修改生产租户也没有把本地测试结果写成“任何版本、任何网络中都绝不会冲突”。从插件切到 CLI我会做这四个检查如果一个工作区之前一直由 VS Code 插件维护后来准备主要交给 Codex CLI我不会重新创建第二套目录而是先在原项目根目录运行microi doctor microi profile list microisyncstatus--scopeall--profile1microi mcp initdoctor用来查看当前 MCP 提供者来源、版本以及 Token、AI 文件是否齐全profile list确认 CLI 看到的服务器和插件一致sync status在任何远端写入前暴露本地较新、服务器较新和双方冲突最后才让较新的入口校准 MCP 配置。反向从 CLI 回到插件也是同一个思路打开原工作区不另建同步目录先看插件的服务器连接和同步结果再决定拉取或推送。如果某个配置文件已经损坏不要为了“快速恢复”直接删除它。当前写入逻辑会失败关闭保留现场修复 JSON 或从备份恢复后再初始化比让任意一端拿空对象覆盖更安全。还有一个容易误解的点共享 Token 文件不等于把账号密码写进项目。CLI 登录时密码只存在于当前进程长期供 MCP 使用的是被 Git 排除的 Token 文件文章归档、截图和提交记录里都不应该出现 Token、Cookie、验证码或本机 clientId。能共用登录态和能公开配置是两回事。什么时候用哪一个如果日常需要资源树、Diff、按钮操作和逐行调试VS Code 插件更顺手如果机器上不想装 IDE或者主要让 Codex/Claude Code 在终端工作CLI 更直接。两者一起装的价值不是功能叠加得越多越好而是团队可以共用连接、Token、MCP、Skills 和同步基线不必因为编辑器偏好拆成两套开发环境。实际使用中我会把“较新的工具负责初始化任意工具负责日常读取和显式操作”作为简单规则。版本跨度较大时先跑microi doctor准备推送 V8 代码前先跑microi sync status。做到这两步CLI 与插件共存就不再是靠运气覆盖文件而是一套能看到来源、版本和冲突边界的工作流。相关资料吾码 AI 开发工具文档https://microi.net/doc/v8-engine/vs-code-plugin.html吾码官网https://microi.net/CLI npm 包https://www.npmjs.com/package/microi.net/cli
返回列表