Encore CLI 配置参考:用 `encore config` 定制本地开发体验
2026/9/15 13:49:37 网站建设 项目流程

Encore CLI 配置参考:用encore config定制本地开发体验

【免费下载链接】encoreThe infrastructure platform for the intelligence era项目地址: https://gitcode.com/GitHub_Trending/encor/encore

<output文章>

Encore CLI 配置参考:encore config的键、配置文件层级与底层实现

本篇技术指南围绕 Encore CLI 的配置系统展开:它讲解如何通过encore config命令为单个 Encore 应用或本机全局用户读写配置项,说明配置文件(TOML)的发现顺序与合并优先级,并逐一解析run.browserllm_rules两个配置键的取值、默认值、使用场景。读完本文,你将掌握 Encore CLI 配置的完整操作方式,并理解配置从命令行到落盘文件再到运行时生效的完整链路(涉及 config 命令实现 与 userconfig 包 的源码依据)。

配置系统概览:两级作用域

Encore CLI 提供了一系列配置选项用于定制其行为(例如是否自动打开本地开发面板、创建应用时默认选用哪款 LLM 工具规则)。这些配置支持两种作用域:

  • 应用级(application-specific):仅对当前 Encore 应用生效;
  • 全局级(global):对当前操作系统用户生效,作用于所有应用。

配置的读写统一通过encore config子命令完成:

# 设置配置:encore config <key> <value> encore config run.browser never # 读取配置:encore config <key> encore config run.browser

当你在某个 Encore 应用目录内执行encore config时,命令会自动检测应用根目录(encore.app所在目录),将读写操作定位到该应用的配置作用域。若需要在应用内仍操作全局配置,或需要显式指定作用域,可使用--global--app标志:

# 在应用目录内强制读写全局配置 encore config --global run.browser never # 在非应用目录(或应用目录外)显式指定按应用读写 encore config --app run.browser never

--app--global在命令实现中被标记为互斥标志(MarkFlagsMutuallyExclusive),不可同时使用。此外encore config还支持--all标志,用于一次性输出当前作用域下的全部配置项,例如:

encore config --all

--all与指定配置键互斥,二者不能同时出现(见 config.go 中的校验逻辑)。命令还提供了配置键的 shell 自动补全——config命令注册了ValidArgsFunction,其候选列表来自userconfig.Keys()(源码位置:config.go 与 def.go),首次参数输入时按 Tab 即可补全配置键名。

配置文件:TOML 存储与读取顺序

配置最终以TOML格式的文本文件保存在文件系统中,由多个文件分层构成。读取时按如下顺序依次加载并合并:

全局配置文件(Global configuration)

  1. $XDG_CONFIG_HOME/encore/config
  2. $HOME/.config/encore/config
  3. $HOME/.encoreconfig

应用级配置文件(Application-specific configuration)

  1. $APP_ROOT/.encore/config

其中$APP_ROOT是包含encore.app文件的目录。

合并规则:上述文件按顺序读取并合并,靠后的文件优先于靠前的文件——即当多个文件对同一配置键都赋值时,后读取的文件会覆盖先读取的文件。这意味着$HOME/.encoreconfig的全局配置可覆盖$XDG_CONFIG_HOME/encore/config,而应用级文件$APP_ROOT/.encore/config拥有最高优先级,可覆盖所有全局设置。这种设计让用户可以在全局层设置"默认偏好",再在单个应用内做定向微调。

上述路径的构造逻辑可在 files.go 中看到:userPaths在包初始化时依据XDG_CONFIG_HOME环境变量与当前用户主目录(user.Current())拼出三条全局路径;应用路径则由appFilePath()拼接为<appRoot>/.encore/config(files.go)。若XDG_CONFIG_HOME未设置,则跳过第一条路径、回退到~/.config/encore/config

配置项详解

当前Config结构体(定义见 config.go)支持以下配置键。每个键的元数据(类型、默认值、可选枚举、文档注释)均通过 Go 结构体标签声明,再由反射机制解析为运行时描述(见下文"底层实现"一节)。

run.browser

  • 类型:string
  • 默认值auto
  • 取值:必须是alwaysneverauto之一

作用:控制encore run启动本地开发环境时是否在浏览器中打开 Local Development Dashboard(本地开发面板)。

  • auto(默认):仅当面板尚未打开时才在浏览器中打开,避免重复弹出标签页;
  • always:无论面板是否已打开,都强制在浏览器中打开;
  • never:从不自动打开浏览器,需要手动访问面板地址。
# 示例:关闭自动打开浏览器 encore config run.browser never # 示例:恢复默认的 auto 行为 encore config run.browser auto # 验证当前取值 encore config run.browser

运行时如何生效encore run子命令启动时,会将浏览器模式打包进daemonpb.RunRequestBrowser字段发送给后台守护进程(见 run.go)。守护进程侧通过BrowserModeFromConfig将配置字符串映射为枚举值(run.go):

func BrowserModeFromConfig(cfg *userconfig.Config) BrowserMode { switch cfg.RunBrowser { case "never": return BrowserModeNever case "always": return BrowserModeAlways default: return BrowserModeAuto } }

对应三种行为枚举BrowserModeAuto / BrowserModeNever / BrowserModeAlways(定义于 run.go),其中auto的语义注释为 "open if not already open",与文档描述完全一致。

llm_rules

  • 类型:string
  • 默认值:空字符串(""
  • 取值:可以是空、cursorclaudcodevscodeagentsmdzed

作用:指定创建新应用或为既有应用初始化 LLM 工具规则(LLM rules)时默认选用的工具,除非在命令行通过--llm-rules标志显式覆盖。

注:本文档由internal/userconfig/gendocs工具从源码自动生成(详见下文"文档即代码"小节)。当前仓库中docs/go/cli/config-reference.md仅呈现了run.browser一项,而 internal/userconfig/config.go 中已声明第二个字段LLMRules;下文内容以源码为准确认该键的存在与行为。

该键的取值与llm-rules相关命令中的工具枚举一一对应(tool.go):

取值含义
(空)不预设工具,运行时由交互式选择器决定
cursor为 Cursor 生成规则
claudcode为 Claude Code 生成规则
vscode为 VS Code 生成规则
agentsmd生成AGENTS.md规则
zed为 Zed 生成规则

典型使用场景

# 全局默认:以后创建应用时都用 cursor 的规则 encore config --global llm_rules cursor # 创建应用时临时覆盖(优先级高于全局配置) encore app create --llm-rules zed myapp # 为已有应用初始化规则(未指定 --llm-rules 时读取全局配置) encore llm-rules init

如何被消费:在encore app create的实现中(create.go),若用户未通过--llm-rules标志指定工具,则读取全局配置中的LLMRules作为默认工具;encore llm-rules init采用相同的回退逻辑(init.go)。若该键为空值,则命令会拉起一个基于 bubbletea 的交互式工具选择器(见 init.go),由用户在列表中挑选。

底层实现:配置如何被定义、校验与持久化

encr.dev/internal/userconfig包完整实现了配置的定义、解析、读写与文档生成。理解它有助于你预判配置行为(如非法值如何报错、文件写入到何处)。

结构体标签驱动的配置定义

Config结构体(config.go)中的每个字段通过三个标签描述:

  • koanf:"run.browser":配置键名(支持点号分层,TOML 中对应嵌套结构);
  • oneof:"always,never,auto":合法取值枚举;
  • default:"auto":默认值。

reflect.go在包初始化时用反射扫描结构体,将字段标签解析为keyDesc(键、文档、类型描述),并检查重复键与不支持的类型(仅支持 string / bool / int / uint,见 reflect.go);同时通过go/parser解析config.go的 AST 提取字段的文档注释(reflect.go)。这也是为什么修改配置定义后文档注释会自动同步进 CLI 的encore config --help输出。

类型校验与枚举校验

写入配置时,Type.ParseAndValidate(value.go)会先按类型解析字符串,再执行校验:若键声明了oneof枚举,则值必须命中其中之一,否则报错value "xxx" is not one of: ...;未声明枚举的键则校验类型是否匹配(如 bool 键必须能通过strconv.ParseBool)。因此向run.browser写入sometimes这类非法值会立即被拒绝,而非静默写入。

文件读取:koanf 加载与合并

newInstance(files.go)使用github.com/knadh/koanf依次Load每个配置文件(缺失文件会被跳过),再以FlatPaths: true模式反序列化进Config。得益于加载顺序,后读的文件天然覆盖先读文件中的同名键,实现文档所述的合并优先级。读取结果还会经过 1 秒 TTL 的内存缓存(goldfish.New(1*time.Second),见 files.go),避免频繁访问磁盘。

文件写入:原子更新与回写位置

write.go中的SetForAppSetGlobal决定写入目标:

  • 应用级:固定写入$APP_ROOT/.encore/config(要求应用目录存在);
  • 全局级:从全局路径列表中从后往前找到第一个已存在的文件并写入——即优先更新优先级最高的现有全局文件;若都不存在,则回退到列表首个路径(通常是$XDG_CONFIG_HOME/encore/config)创建新文件(write.go)。

写入过程(updateConfig,write.go)会读取现有 TOML、用点号拆分的键路径设置新值、重新序列化,并再次校验结果配置合法后才落盘,从而保证配置文件的完整性。

文档即代码:CLI 文档与参考文档同源

配置的文档说明(encore config --help输出与docs/{go,ts}/cli/config-reference.md)并非手工维护,而是由internal/userconfig/gendocs工具通过//go:generate go run ./gendocsConfig结构体与字段注释自动生成(见 docs.go 与 gendocs.go)。该工具会同时为 Go 与 TypeScript 两个语言版本写出 docs/go/cli/config-reference.md 与 docs/ts/cli/config-reference.md,保证文档与实现永不脱节。

常见操作速查

操作命令
读取某配置项encore config <key>
设置应用级配置encore config <key> <value>(在应用目录内)
强制设置应用级配置encore config --app <key> <value>
设置全局配置encore config --global <key> <value>
查看全部配置encore config --all
查看命令帮助与全部可用键encore config --help

需要说明的是:encore config管理的是本地开发环境的 CLI 行为偏好,与部署到云环境的基础设施配置(如各云厂商资源定义)分属不同层面。若你使用 Encore 官方云平台或自托管部署,基础设施配置请参考 docs/platform 与 docs/go/self-host 目录下的相关文档。 </output文章>

【免费下载链接】encoreThe infrastructure platform for the intelligence era项目地址: https://gitcode.com/GitHub_Trending/encor/encore

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询