num30-config by aaronflorey/agent-skills
npx skills add https://github.com/aaronflorey/agent-skills --skill num30-config此技能提供对 num30/config (github.com/num30/config) 的全面了解,这是一个声明式的 Go 配置库,可通过单次调用从 YAML/JSON/TOML 文件、环境变量和命令行标志中读取配置。
安装:
go get github.com/num30/config
最小化用法:
import "github.com/num30/config"
type Config struct {
Host string `default:"localhost" validate:"required"`
Port int `default:"8080"`
}
func main() {
var cfg Config
err := config.NewConfReader("myapp").Read(&cfg)
if err != nil {
panic(err)
}
}
值按以下顺序合并(优先级高的胜出):
--host=localhost)HOST=localhost)This skill provides comprehensive knowledge of num30/config (github.com/num30/config), a declarative Go configuration library that reads config from YAML/JSON/TOML files, environment variables, and command-line flags in a single call.
Install:
go get github.com/num30/config
Minimal usage:
import "github.com/num30/config"
type Config struct {
Host string `default:"localhost" validate:"required"`
Port int `default:"8080"`
}
func main() {
var cfg Config
err := config.NewConfReader("myapp").Read(&cfg)
if err != nil {
panic(err)
}
}
Values are merged in this order (highest priority wins):
--host=localhost)HOST=localhost)广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
myapp.yamldefault:"localhost")| 标签 | 用途 | 示例 |
|---|---|---|
default:"val" | 默认值 | default:"localhost" |
validate:"rule" | 验证规则 (go-playground/validator) | validate:"required" |
flag:"name" | 覆盖 CLI 标志名称 | flag:"debug" |
envvar:"NAME" | 覆盖环境变量名称 | envvar:"DB_PASS" |
usage:"text" | 标志用法/帮助文本 | usage:"enable debug logging" |
mapstructure:",squash" | 将嵌入结构体字段扁平化到父级 | 见下文 |
config.NewConfReader("myapp") // 创建读取器(配置名 = 文件名 + 环境变量前缀基础)
.WithSearchDirs("/etc/conf", "./") // 覆盖配置文件搜索目录(默认:home + 当前目录)
.WithPrefix("MYAPP") // 环境变量前缀:MYAPP_DB_HOST
.Read(&cfg) // 读取并填充结构体(返回错误)
监听实时配置变更:
reader := config.NewConfReader("myapp")
err := reader.Read(&cfg)
mutex := reader.Watch() // 在 Read() 之后调用;如果在之前调用会 panic
// 线程安全访问:
mutex.RLock()
val := cfg.SomeField
mutex.RUnlock()
文件名:<configName>.yaml(或 .json、.toml、.hcl、.ini、.env、.properties)
搜索顺序:主目录,然后是当前目录(可通过 WithSearchDirs 覆盖)
字段名映射:camelCase → 小写驼峰式 YAML 键
db: dbName: "mydb"
FIELD_PATH,点号替换为 _,转为大写
App.Server.Port → APP_SERVER_PORTNewConfReader("x").WithPrefix("MYAPP") → MYAPP_APP_SERVER_PORTenvvar 标签覆盖:Password string \envvar:"DB_PASS"``→ 从DB_PASS读取--
App.Server.Port → --app.server.port=8080--verboseflag 标签覆盖:Debug bool \flag:"debug"``→\--debug--slice a --slice b--bytes dGVzdA==package main
import (
"fmt"
"time"
"github.com/num30/config"
)
type Config struct {
GlobalConfig `mapstructure:",squash"` // squash:字段提升到顶级
Debug bool
DB DatabaseConfig
DefaultVal string `default:"default value"`
Tags []string `default:"[\"a\",\"b\"]"`
}
type GlobalConfig struct {
Verbose bool `flag:"verbose" usage:"enable verbose logging"`
}
type DatabaseConfig struct {
Host string `default:"localhost" validate:"required"`
Password string `validate:"required" envvar:"DB_PASS"`
DbName string `default:"mydb"`
Username string `default:"root"`
Port int `default:"5432"`
Timeout time.Duration `default:"30s"`
}
func main() {
var cfg Config
err := config.NewConfReader("myapp").
WithSearchDirs("/etc/myapp", "./").
WithPrefix("MYAPP").
Read(&cfg)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", cfg)
}
在嵌入的结构体上使用 mapstructure:",squash",以在配置文件和 env vars 中将其字段提升到父级:
type GlobalConfig struct { Verbose bool }
type AppConfig struct {
GlobalConfig `mapstructure:",squash"` // 以 `verbose` 访问,而非 `globalConfig.verbose`
Name string
}
配置文件:verbose: true(而非 globalConfig.verbose: true) 环境变量:VERBOSE=true(而非 GLOBAL_CONFIG_VERBOSE=true)
所有基本类型都支持作为配置字段:bool、int/int8/int16/int32/int64、uint/uint8/uint16/uint32/uint64、float32/float64、string、[]string、[]byte(标志/env 中为 base64)、time.Duration
在结构体字段上使用 go-playground/validator 标签:
type Config struct {
Host string `validate:"required"`
Port int `validate:"min=1,max=65535"`
Email string `validate:"required,email"`
}
如果约束被违反,Read() 会返回验证错误。完整标签列表请参阅 validator 文档。
import "github.com/num30/config/lib"
type Config struct {
DB lib.PostgresqlDb // 提供 Host, Password, DbName, Username, Port, SslEnabled 及合理的默认值
}
// 获取连接字符串:
connStr := cfg.DB.GetConnString()
// → "host=localhost user=postgres password=pass database= port=5432 sslmode=disable"
lib.PostgresqlDb 默认值:Host:"localhost"、Password:"pass"、Username:"postgres"、Port:5432、SslEnabled:false
type Config struct {
Slice []string
}
| 源 | 格式 |
|---|---|
| 环境变量 | SLICE=a,b,c |
| 配置文件 | slice: ["a", "b", "c"] |
| CLI 标志 | --slice a --slice b |
Read() 返回以下错误:
"failed to unmarshal struct")"failed to set default values")"validation error: Key: '...' Error:...")如果在 Read() 之前调用 Watch() 会 panic。
每周安装数
1
仓库
首次出现
1 天前
安全审计
安装于
amp1
cline1
opencode1
cursor1
kimi-cli1
codex1
myapp.yaml)default:"localhost")| Tag | Purpose | Example |
|---|---|---|
default:"val" | Default value | default:"localhost" |
validate:"rule" | Validation rule (go-playground/validator) | validate:"required" |
flag:"name" | Override CLI flag name | flag:"debug" |
envvar:"NAME" | Override env var name | envvar:"DB_PASS" |
usage:"text" | Flag usage/help text | usage:"enable debug logging" |
mapstructure:",squash" | Squash embedded struct fields to parent level | see below |
config.NewConfReader("myapp") // create reader (config name = file name + env prefix base)
.WithSearchDirs("/etc/conf", "./") // override config file search dirs (default: home + current dir)
.WithPrefix("MYAPP") // prefix for env vars: MYAPP_DB_HOST
.Read(&cfg) // read and populate struct (returns error)
Watch for live config changes:
reader := config.NewConfReader("myapp")
err := reader.Read(&cfg)
mutex := reader.Watch() // call AFTER Read(); panics if called before
// thread-safe access:
mutex.RLock()
val := cfg.SomeField
mutex.RUnlock()
File name: <configName>.yaml (or .json, .toml, .hcl, .ini, .env, .properties)
Search order: home directory, then current directory (override with WithSearchDirs)
Field name mapping: camelCase → lower camelCase YAML key
db: dbName: "mydb"
FIELD_PATH with dots replaced by _, uppercased
App.Server.Port → APP_SERVER_PORTNewConfReader("x").WithPrefix("MYAPP") → MYAPP_APP_SERVER_PORTenvvar tag: Password string \envvar:"DB_PASS"``→ reads fromDB_PASS-- prefix
App.Server.Port → --app.server.port=8080--verboseflag tag: Debug bool \flag:"debug"``→\--debug--slice a --slice b--bytes dGVzdA==package main
import (
"fmt"
"time"
"github.com/num30/config"
)
type Config struct {
GlobalConfig `mapstructure:",squash"` // squash: fields promoted to top level
Debug bool
DB DatabaseConfig
DefaultVal string `default:"default value"`
Tags []string `default:"[\"a\",\"b\"]"`
}
type GlobalConfig struct {
Verbose bool `flag:"verbose" usage:"enable verbose logging"`
}
type DatabaseConfig struct {
Host string `default:"localhost" validate:"required"`
Password string `validate:"required" envvar:"DB_PASS"`
DbName string `default:"mydb"`
Username string `default:"root"`
Port int `default:"5432"`
Timeout time.Duration `default:"30s"`
}
func main() {
var cfg Config
err := config.NewConfReader("myapp").
WithSearchDirs("/etc/myapp", "./").
WithPrefix("MYAPP").
Read(&cfg)
if err != nil {
panic(err)
}
fmt.Printf("%+v\n", cfg)
}
Use mapstructure:",squash" on an embedded struct to promote its fields to the parent level in config files and env vars:
type GlobalConfig struct { Verbose bool }
type AppConfig struct {
GlobalConfig `mapstructure:",squash"` // access as `verbose`, not `globalConfig.verbose`
Name string
}
Config file: verbose: true (not globalConfig.verbose: true) Env var: VERBOSE=true (not GLOBAL_CONFIG_VERBOSE=true)
All primitive types are supported as config fields: bool, int/int8/int16/int32/int64, uint/uint8/uint16/uint32/uint64, float32/float64, string, []string, []byte (base64 in flags/env), time.Duration
Uses go-playground/validator tags on struct fields:
type Config struct {
Host string `validate:"required"`
Port int `validate:"min=1,max=65535"`
Email string `validate:"required,email"`
}
Read() returns a validation error if constraints are violated. See validator docs for full tag list.
import "github.com/num30/config/lib"
type Config struct {
DB lib.PostgresqlDb // provides Host, Password, DbName, Username, Port, SslEnabled with sane defaults
}
// Get connection string:
connStr := cfg.DB.GetConnString()
// → "host=localhost user=postgres password=pass database= port=5432 sslmode=disable"
lib.PostgresqlDb defaults: Host:"localhost", Password:"pass", Username:"postgres", Port:5432, SslEnabled:false
type Config struct {
Slice []string
}
| Source | Format |
|---|---|
| Env var | SLICE=a,b,c |
| Config file | slice: ["a", "b", "c"] |
| CLI flags | --slice a --slice b |
Read() returns errors for:
"failed to unmarshal struct")"failed to set default values")"validation error: Key: '...' Error:...")Watch() panics if called before Read().
Weekly Installs
1
Repository
First Seen
1 day ago
Security Audits
Installed on
amp1
cline1
opencode1
cursor1
kimi-cli1
codex1
Azure Data Explorer (Kusto) 查询技能:KQL数据分析、日志遥测与时间序列处理
114,200 周安装