
OpenCode 实例管理一文讲透如何同时改三个项目不串台【免费下载链接】opencodeThe open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/openc/opencode周一上午九点你打开电脑手头压着三个项目前端要加组件、后端要改接口、还有个老仓库要查 bug。如果用一个只认一个上下文的 AI 编程助手你多半要来回复制粘贴、反复切终端。OpenCode 的实例管理就是为这个场景设计的每个项目目录对应一个独立实例多个会话并发跑互不串台。9 点把项目目录跑成一个 OpenCode 实例你在前端目录里开一个会话时OpenCode 先把这个目录解析成实例上下文里面就三样东西工作目录、git worktree、项目信息。你可以把它理解成给每个项目发的工牌之后每个会话只认自己戴的这块工牌。这段逻辑在 packages/opencode/src/project/instance-context.ts 的 InstanceContext 接口里核心结构长这样export interface InstanceContext { directory: string // 本会话的工作目录 worktree: string // git worktree project: Project.Info // 项目信息 }后续所有读文件、跑命令、改代码的工具调用都会先拿这块工牌做边界校验文件必须落在这个实例的目录或 worktree 范围内否则会被当作跨目录访问而触发权限询问。也就是说前端会话不会顺手改掉后端仓库的文件。11 点多项目并发会话背后隔离的两层机制不用看全盯两层就够。第一层是实例存储instance-store.ts 里的 InstanceStore 以目录为键做缓存同一目录的并发请求只会创建一个实例其余请求等待同一个结果同一个目录要重载时会先清理旧实例再启动新的保证不会出现新旧两份状态打架。第二层是边界校验containsPath 函数负责判断某个路径是否在本实例范围内如果项目不是 git 仓库worktree 会退回成 /它会自动跳过 worktree 检查避免所有绝对路径都被误判为在范围内。这两层叠在一起你同时开三个终端会话各干各的读写都只在各自目录里目录级实例隔离就是这么来的。下午状态缓存为什么不会串LSP、快照、权限这些工具的状态不是挂在全局上的而是挂在以目录为键的状态柜上instance-state.ts 里 InstanceState.make 创建一个 ScopedCache取状态时按当前目录键去查。会话结束、实例被 dispose 时注册的清理函数会把该目录名下的缓存全部失效。可以类比成每个项目都有自己的独立抽屉下班dispose 实例时把抽屉清空下一个人接手时拿不到旧文件。所以三个实例同时开着也不会互相借走对方的状态。收尾前会话出状况时的三件事改了配置发现没生效时触发一次该目录的 reload旧实例会被完整清理再重建比重启整个程序更省事。看到跨出目录的权限询问先确认工作目录开对了这说明某个路径落不到当前实例的边界内。想并行处理多个项目时直接每个目录各开一个终端就行实例存储已经按目录保证单例不需要自己写并发控制。今晚就做一件事随便挑一个项目目录敲opencode起一个会话再在第二个目录起一个分别让两边改各自的文件确认互不干扰。下次手头同时压着三个项目你就知道该从哪下手了。【免费下载链接】opencodeThe open source coding agent.项目地址: https://gitcode.com/GitHub_Trending/openc/opencode创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考