模型: claude-opus-4-6 (anthropic/claude-opus-4-6)
生成日期: 2026-02-17
Plugin 的定义再精妙,如果无法被正确加载和初始化,也只是一纸空文。本节将解析 OpenCode 是如何发现、安装和加载 Plugin 的。
13.3.1 内置 Plugin
OpenCode 内置了三个认证 Plugin,它们通过直接 import 加载,不需要经过 npm 安装流程:
// plugin/index.ts
import { CodexAuthPlugin } from "./codex"
import { CopilotAuthPlugin } from "./copilot"
import { gitlabAuthPlugin as GitlabAuthPlugin } from "@gitlab/opencode-gitlab-auth"
const INTERNAL_PLUGINS: PluginInstance[] = [
CodexAuthPlugin,
CopilotAuthPlugin,
GitlabAuthPlugin,
]
为 OpenAI 的 Codex API 提供 OAuth 认证
为 GitHub Copilot 提供设备流 OAuth 认证
此外,还有一个内置的 npm Plugin(opencode-anthropic-auth),通过 npm 安装流程加载。
13.3.2 Plugin 加载流程
Plugin 的完整加载流程在 Instance.state() 的初始化函数中实现:
当 Plugin 字符串不以 file:// 开头时,OpenCode 将其视为 npm 包,通过 BunProc.install() 动态安装:
BunProc.install() 使用 bun install 将包安装到 OpenCode 的数据目录中,返回安装后的模块路径,然后通过 import() 动态加载。
以 file:// 开头的 Plugin 直接从本地文件系统加载:
这种方式主要用于 Plugin 开发和调试——开发者不需要将 Plugin 发布到 npm 就可以测试。
Plugin 模块可能同时导出命名导出和默认导出,指向同一个函数:
如果不去重,Object.entries(mod) 会返回两个条目(myPlugin 和 default),导致 Plugin 被初始化两次。seen Set 通过引用比较(has(fn))避免了这个问题。
Plugin 加载过程中的错误被精心处理,确保单个 Plugin 的失败不会影响整个系统:
对于内置 Plugin,安装失败只会发出错误事件并继续加载其他 Plugin。对于用户配置的 Plugin,安装失败会抛出错误,因为用户显式声明了对该 Plugin 的依赖。
13.3.4 Plugin 初始化
加载完成后,Plugin.init() 执行两个初始化操作:
Plugin 加载机制支持三种来源,按加载顺序排列:
BunProc.install() + 动态 import()
加载过程的可靠性由以下机制保证:
容错降级:内置 Plugin 安装失败时继续运行。
旧版跳过:已被内置替代的 Plugin 自动跳过。
环境开关:OPENCODE_DISABLE_DEFAULT_PLUGINS 可禁用内置 Plugin。