Documentation
¶
Overview ¶
包 appconfig 是一个基于 JSON 文件的轻量级配置存储库。
实例用法:NewManager 创建一个 Manager,经 Init(可选,装配存储路径)与 RegisterDefaults(可选,注册首运模板)完成装配,Load 返回加载好的配置 对象,后续所有读写都作用在这个对象上:
m := appconfig.NewManager()
m.Init("", "myapp", "config.json") // 可选;空参数用缺省值
m.RegisterDefaults(defaultJSON) // 可选;//go:embed 的模板
c, err := m.Load()
c.Set("port", 9090)
c.Save()
Index ¶
- Constants
- type CheckResult
- type Config
- func (c *Config) Check(schema Schema) CheckResult
- func (c *Config) DeclaredVersion() string
- func (c *Config) DecodeFields(target any) error
- func (c *Config) Get(key string) (any, bool)
- func (c *Config) Meta() map[string]any
- func (c *Config) Normalize(schema Schema) error
- func (c *Config) Path() string
- func (c *Config) ResolveVersion(schemaVersion string)
- func (c *Config) ResolvedVersion() string
- func (c *Config) Save() error
- func (c *Config) Set(key string, value any)
- func (c *Config) SetFieldsFrom(source any) error
- type CorruptConfigError
- type FieldDef
- type FieldType
- type Manager
- type Schema
- type SchemaFile
- type SchemaMeta
Constants ¶
const UnknownVersion = "UNKNOWN"
UnknownVersion 表示无法识别的数据版本号。
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type CheckResult ¶ added in v0.3.0
type CheckResult int
CheckResult 表示 data 相对于 schema 的校验状态。
const ( Valid CheckResult = iota // 严格符合 schema MissingDefaults // 仅缺少带默认值的非必填字段 ExtraFields // 仅有 schema 未定义的多余字段 MissingAndExtra // 既缺带默认值的字段,又有多余字段 Invalid // 必填缺失或类型不匹配 )
type Config ¶
type Config struct {
// contains filtered or unexported fields
}
Config 持有以磁盘 JSON 文件为后端的配置值。 data 存储完整的 {meta, fields} 两层结构。 实例方法未做并发同步:多 goroutine 共享时由调用方自行加锁。
func (*Config) Check ¶ added in v0.5.0
func (c *Config) Check(schema Schema) CheckResult
Check 用 schema 校验当前 fields 层,返回校验状态。 等价于在 fields() 上调用 Schema.Check,但无需手动提取 map。
func (*Config) DeclaredVersion ¶ added in v0.4.0
DeclaredVersion 返回 config.json 中声明的数据版本号。 无法识别时返回 UnknownVersion。
func (*Config) DecodeFields ¶ added in v0.5.0
DecodeFields 将 fields 层按 JSON tag 解码到 target(必须为指针)。 经 JSON 往返实现:fields 中缺失的键不会改动 target 的对应字段, 因此指针字段可区分"未设置"(nil)与"显式零值"(指向零值的指针)。
func (*Config) Normalize ¶ added in v0.5.0
Normalize 按 schema 规范化当前 fields 层:补全缺失的默认值、删除多余字段。 Valid 状态下为 no-op(直接返回 nil);MissingDefaults / ExtraFields / MissingAndExtra 状态下执行规范化并写回;Invalid 状态返回错误。
func (*Config) ResolveVersion ¶ added in v0.4.0
ResolveVersion 在 schema 校验通过后调用,将 resolvedVersion 设为 schema 的 meta.version。若 schemaVersion 为空则设为 UnknownVersion。
func (*Config) ResolvedVersion ¶ added in v0.4.0
ResolvedVersion 返回经 schema 校验后确定的实际数据版本号。 未经校验或无法识别时返回 UnknownVersion。
func (*Config) SetFieldsFrom ¶ added in v0.5.0
SetFieldsFrom 将 source 按 JSON tag 编码后整体替换 fields 层,meta 层不受影响。 source 为 nil 或无法编码为 JSON 对象时返回错误。
type CorruptConfigError ¶ added in v0.5.0
CorruptConfigError 表示已存在的配置文件无法读取或解析。 调用方应用 errors.As 识别本错误,向用户报错并退出,不得静默改用默认值。
func (*CorruptConfigError) Error ¶ added in v0.5.0
func (e *CorruptConfigError) Error() string
Error 实现 error 接口,信息携带配置文件路径与原始错误。
func (*CorruptConfigError) Unwrap ¶ added in v0.5.0
func (e *CorruptConfigError) Unwrap() error
Unwrap 返回原始错误,支持 errors.Is/As 链式判断。
type FieldDef ¶ added in v0.3.0
type FieldDef struct {
Type FieldType
Required bool
Default any // nil 表示无默认值;仅当 Required 为 false 时有意义
}
FieldDef 描述一个配置键:期望类型、是否必填,以及可选的默认值(仅在非必填时生效)。
type Manager ¶ added in v0.6.0
type Manager struct {
// contains filtered or unexported fields
}
Manager 装配并持有一份配置:存储路径、首运模板与已加载的配置对象。 装配方法(Init/RegisterDefaults/Load/HandleCLI)在实例互斥锁上串行化, 未导出辅助方法由调用方持锁。内含 sync.Mutex:勿按值复制,始终通过指针使用。 指向同一路径的多个 Manager 之间没有文件锁,交叉写回时最后 Save 者胜出。
func (*Manager) HandleCLI ¶ added in v0.6.0
HandleCLI 接管客户端命令行中的 config 子命令。 args 应传入 os.Args[1:]:当 args[0] 恰为 "config" 时,接管该参数及其后的 所有参数并返回 shouldClose = true,客户端应跳过正常流程——出错时打印 err 并以非零码退出,否则直接退出(--edit 的用户反馈由库自己输出)。 配置文件位置与首运模板来自该 Manager 实例的装配(Init/RegisterDefaults), 未装配时使用缺省值。不是以 config 开头时返回 shouldClose = false,不做任何事。 推荐在 Load 之前调用:--edit 的修复结果可被本次运行的 Load 直接读到。
func (*Manager) Init ¶ added in v0.6.0
Init 装配该 Manager 的存储路径,仅能在成功 Load 之前调用一次。 三个参数传空字符串时使用缺省值:
- firstDir:配置文件一级目录(完整绝对路径),缺省为 os.UserConfigDir();
- secondDir:二级目录名,可含路径分隔符实现嵌套,缺省为可执行文件名 (不含扩展名)。注意 exe 改名会改变缺省路径,需要稳定路径时显式传入;
- fileName:配置文件名,缺省为 "config.json"。
firstDir 必须是绝对路径;secondDir 不得为绝对路径或包含 ".." 上跳成分; fileName 必须是纯文件名。重复调用或成功加载后调用返回错误; 懒装配 Load 失败(cfg 仍为 nil)后仍可 Init。
func (*Manager) Load ¶ added in v0.6.0
Load 返回该 Manager 的配置对象(幂等,后续调用返回同一对象)。 首次调用完成路径装配并加载:文件不存在且已注册模板时按首运流程创建, 并从磁盘重读(保证数值类型与后续运行一致);文件存在但无法读取或解析时 返回 nil 和 *CorruptConfigError,不提供默认值降级,也不覆盖磁盘上的坏文件; 文件不存在且未注册模板时返回错误。 未调用 Init 时按全缺省值装配(用户配置目录 + 可执行文件名 + config.json)。
func (*Manager) RegisterDefaults ¶ added in v0.6.0
RegisterDefaults 注册首运创建配置文件所用的默认模板,仅能注册一次。 defaultJSON 必须是合法的 JSON 对象,注册时立即校验,非法即报错; 校验失败不消耗"仅一次"名额,可修正后重试。
type Schema ¶ added in v0.3.0
Schema 是以配置键名为索引的字段定义集合。 它有意独立于 Config,使调用方自行掌控 schema 与校验生命周期。
func ParseSchema ¶ added in v0.4.0
ParseSchema 从 JSON 字节中解析出 Schema(仅提取 fields 部分)。 客户端可通过返回的 SchemaFile 访问 meta 信息。
type SchemaFile ¶ added in v0.4.0
type SchemaFile struct {
Meta SchemaMeta `json:"meta"`
Fields map[string]FieldDef `json:"fields"`
}
SchemaFile 是 schema.json 的顶层结构,将元数据与字段定义分组。
func ParseSchemaFile ¶ added in v0.4.0
func ParseSchemaFile(data []byte) (*SchemaFile, error)
ParseSchemaFile 从 JSON 字节中解析出完整的 SchemaFile(含 meta)。
type SchemaMeta ¶ added in v0.4.0
type SchemaMeta struct {
Version string `json:"version"`
}
SchemaMeta 是 schema 文件的元数据部分,由客户端自行填充。