01 配置层级与合并优先级 本节摘要:一个能跑的内核背后一定有一套能管的配置体系。OpenCode 的配置不是单一文件,而是多层合并——默认值、项目级、用户级、运行时注入,按优先级叠加,冲突时谁胜出有明确规则。本节讲清这套配置层级、合并优先级、以及为什么这么设计。 一、配置不是单一文件 先破除一个误解:OpenCode 的配置不是「一个文件管所有」。它是多层的,每层有不同的作用范围和优先级: 层级 | 作用范围 | 典型内容 默认值 | 所有会话 | 内核内置的合理默认 用户级 | 该用户的所有项目 | 用户偏好(模型、主题、全局权限) 项目级 | 当前项目 | 项目特定(Agent、权限、技能路径) 运行时注入 | 本次运行 | 环境变量、命令行参数、平台注入
本节摘要:一个能跑的内核背后一定有一套能管的配置体系。OpenCode 的配置不是单一文件,而是多层合并——默认值、项目级、用户级、运行时注入,按优先级叠加,冲突时谁胜出有明确规则。本节讲清这套配置层级、合并优先级、以及为什么这么设计。
先破除一个误解:OpenCode 的配置不是「一个文件管所有」。它是多层的,每层有不同的作用范围和优先级:
| 层级 | 作用范围 | 典型内容 |
|---|---|---|
| 默认值 | 所有会话 | 内核内置的合理默认 |
| 用户级 | 该用户的所有项目 | 用户偏好(模型、主题、全局权限) |
| 项目级 | 当前项目 | 项目特定(Agent、权限、技能路径) |
| 运行时注入 | 本次运行 | 环境变量、命令行参数、平台注入 |
这四层从宽到窄、从通用到具体,叠加起来构成「本次运行最终生效的配置」。
四层叠加,冲突时谁胜出?优先级从低到高:
默认值(最低) → 用户级 → 项目级 → 运行时注入(最高)
也就是说:运行时注入 > 项目级 > 用户级 > 默认值。越具体的层级优先级越高——这符合「越具体的意图越该被尊重」的常识。
这个优先级不是随意的,它反映了一个原则:具体胜过通用。
💡 类比:就像法律——宪法(默认)给大原则,地方法规(用户级)细化,公司规章(项目级)更具体,这次的任务指令(运行时)最具体。具体覆盖通用。
逐层看它们各自管什么:
内核内置的「开箱默认」。比如默认 Agent 是 build、默认权限规则、默认模型参数。这层保证「不配也能跑」。
用户主目录下的配置文件,管「我的全局偏好」:
这层跨项目生效——不管在哪个项目,这些偏好都适用。
项目根的配置文件(第 11 章说的配置目录里的核心文件),管「这个项目的特定设置」:
这层只在当前项目生效——换个项目就不适用。
环境变量、命令行参数、平台(如 OpenWork)注入。管「这次运行的具体指令」:
合并不是「整体替换」,而是按项合并——配置有很多项(模型、权限、技能路径......),每项单独按优先级取:
模型设置: 默认: A 用户级: B 项目级: (没设) 运行时: (没设) ──► 取 B(用户级是设了的最高优先级) 权限规则: 默认: [规则1] 用户级: [规则2] 项目级: [规则3] ──► 取规则3(项目级最高,设了)
每项独立按「设了的最高优先级」取值。这种按项合并让各层能「各管各的」——用户级管模型,项目级管权限,互不覆盖不该管的。
值得提一下配置和权限的关系。第 4 章说的「权限三段合并」(defaults + 特定 + user)其实是配置合并在权限领域的具体应用:
所以理解了本节的配置层级,第 4 章的权限合并就自然懂了——它们是同一套合并思想在不同领域的体现。
配置层级清楚了,下一节讲这些配置怎么被源码管理——工作区编排。