config

package
v0.42.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 10, 2026 License: MIT Imports: 8 Imported by: 0

Documentation

Overview

Package config 提供启动期的静态配置加载管线:yaml 文件 → 环境变量覆盖 → 缺省 → 校验失败一次性汇总 →(可选)敏感字段脱敏 dump。

此前各服务 main 各自手搓同一套装配(sethvargo/go-envconfig + yaml.v3 拼 合),坑在四处理解口径不一:env 与 yaml 谁覆盖谁、校验错误逐个撞而非一次 报完、配置 dump 一打印就泄密、必填与「零值即合法」混同。本包把它们收成 一份正确默认(#329)。

与热更的分工:本包只管**启动期一次性装配**(Load 每进程跑一次,反射成本 不做优化);运行中的原子热更快照不在这里——那是 oekit/core 的 config.Snapshot(#49)领地。静态管线负责「装配对了没有」,热更快照负责 「换配置不抖」。

典型用法:

type DB struct {
    DSN      string `env:"APP_DB_DSN,required" validate:"nonempty"`
    Password string `env:"APP_DB_PASSWORD"`
}
type Config struct {
    DB       DB
    LogLevel string `env:"APP_LOG_LEVEL"           yaml:"log_level"`
    Ports    []int  `env:"APP_PORTS"`
}

cfg := &Config{LogLevel: "info"} // 调用方预置值充当缺省
err := config.Load(cfg,
    config.WithFile("config.yaml"),
    config.WithEnvPrefix("GIT_SYNC_"),
    config.WithRequired("DB.DSN"),
    config.WithSensitive("DB.Password"),
)
fmt.Println(config.Redact(cfg, config.WithSensitive("DB.Password"))) // 日志安全 dump

取值优先级(高 → 低):环境变量 > yaml 文件 > 调用方预置值 > env tag 缺省 (仅当字段为零值时生效)。

env tag 形态对齐 sethvargo/go-envconfig:`env:"NAME"`、`env:"NAME,required"`、 `env:"NAME,default=x"`、`env:"-"` 跳过——存量配置结构体零迁移。声明了不 存在的字段路径(WithRequired/WithSensitive)在 Load/Redact 时即报错/panic (fail-fast:拼错的脱敏声明是泄密面,不允许静默漏过)。

YAML 子集边界(本仓零第三方依赖红线:自研解析器,只覆盖服务配置文件的 常见形态):

支持:块映射与块序列(含「- 与父键同列」的序列、映射序列)、整行与行尾
      # 注释(引号感知)、单引号('' 转义)与双引号(含 \n \t \r \\ \"
      \uXXXX)标量、标量类型推断(true/false、十进制整数、浮点、null/~、
      其余按字符串)、文件头部单个 --- 分隔符。
不支持(遇到即报错,不做静默猜测):锚点与别名(& *)、显式标签(!!)、
      块标量(| 与 >,长文本建议放环境变量)、flow 风格([a,b] 与 {k:v})、
      多文档流(第二段 ---)、重复键、tab 缩进、十六进制/八进制/下划线
      数字、日期时间推断(按字符串落位)。

隐私立场:WithSensitive 声明的字段在 Redact 输出中恒为 "<redacted>"—— 配置 dump 场景的泄密面在库侧关掉;与 logredact 的「凭据形状识别」互补: 配置加载期字段名已知,可以精确到路径。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Load

func Load(cfg any, opts ...LoadOption) error

Load 从 yaml 文件 + 环境变量装配 cfg(必须是指向结构体的非 nil 指针)。

装配规则(见 doc.go):每个叶子字段按「env tag 缺省(仅零值时)→ yaml → env」顺序覆盖;校验全部完成后一次性汇总返回(errors.MultiError)—— 10 个字段全错一次报完,不逐个撞:

  • required(tag `,required` 或 WithRequired):装配后必须非零值;
  • nonempty(tag `validate:"nonempty"`,当前唯一档位):字符串装配后非空。

env tag 形态对齐 sethvargo/go-envconfig,存量配置结构体零迁移。支持的 叶子类型:string、bool、各宽度 int/uint/float、time.Duration、[]string、 []int、[]int64;命名结构体字段按点号路径递归下钻,内嵌结构体透明展开。 指针/map/接口/time.Time 等类型报错(明确不支持,不做静默猜测)。

func Redact

func Redact(cfg any, opts ...LoadOption) string

Redact 生成 cfg 的脱敏字符串表示:每行「字段路径=值」,按路径排序, WithSensitive 声明的字段(含整棵命名子树)恒为 "<redacted>"。面向日志/ 排障的确定性 dump,不是序列化格式——循环渲染不保证往返。

与 Load 共用 LoadOption。cfg 必须是指向结构体的非 nil 指针;脱敏声明含 不存在的路径时 panic(fail-loud:静默漏过拼错的敏感字段是泄密面)。

Types

type LoadOption

type LoadOption func(*loadOptions)

LoadOption 函数选项(Load 与 Redact 共用——WithSensitive 同时决定两处的 脱敏口径;按仓约定命名为 XxxOption,避免多包 co-import 的裸 Option 冲突)。

func WithEnvPrefix

func WithEnvPrefix(prefix string) LoadOption

WithEnvPrefix 指定环境变量名前缀(如 "GIT_SYNC_"),拼在 env tag 名之前; 空串 = 无前缀(缺省)。

func WithFile

func WithFile(path string) LoadOption

WithFile 指定 yaml 配置文件路径(缺省不读文件,纯 env 装配也可用)。 文件不存在按普通装配错误进汇总,不单独 fail-fast。

func WithRequired

func WithRequired(fields ...string) LoadOption

WithRequired 显式声明必填字段(点号分隔的 Go 字段路径,如 "DB.DSN"); 与 env tag 的 `,required` 同语义。声明了不存在的路径在 Load 时报错 (fail-fast:拼错的必填声明等于没声明)。

func WithSensitive

func WithSensitive(fields ...string) LoadOption

WithSensitive 声明敏感字段(点号路径;命名结构体路径即整棵子树脱敏)。 同时约束 Load 的拼写校验与 Redact 的脱敏 dump。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL