配置管理:config.yaml 读取与多环境配置(manifest/config)

引言

任何应用都离不开配置:监听端口、数据库连接、日志目录……GoFrame 把配置管理收敛到 g.Cfg()(v2 门面方法;v1 时代为 g.Config(),v2 迁移说明中有明确说明),默认读取 config.yaml

概念

  • 配置文件:默认文件名 config.yaml。开发时放在 manifest/config/ 下由 gf run 自动加载;编译部署后则放在可执行文件同目录(官方文档对此有专门说明)。
  • 获取配置:g.Cfg().Get(ctx, "key"),键支持点号层级,如 server.address
  • 多环境:官方支持按环境区分配置与配置来源切换(例如通过命令行参数或环境变量指定配置文件路径),具体机制与字段以官方文档 goframe.org 的配置管理章节为准。

代码示例

先看 manifest/config/config.yaml 的常见内容:

server:
  address: ":8000"
  openapiPath: "/api.json"
  swaggerPath: "/swagger"

logger:
  level: "all"
  stdout: true

database:
  default:
    type: "mysql"
    link: "root:12345678@tcp(127.0.0.1:3306)/demo"
    debug: true

程序中读取配置:

package main

import (
	"fmt"

	"github.com/gogf/gf/v2/frame/g"
	"github.com/gogf/gf/v2/os/gctx"
)

func main() {
	ctx := gctx.New()

	// 按点号路径读取,返回 *gvar.Var
	address, err := g.Cfg().Get(ctx, "server.address")
	if err != nil {
		panic(err)
	}
	fmt.Println("server.address =", address.String())

	// 带默认值读取:键不存在时返回默认值
	level := g.Cfg().MustGet(ctx, "logger.level", "info")
	fmt.Println("logger.level =", level.String())

	// 读取整段配置并做类型转换(Var 提供 Int/String/Bool 等方法)
	port := g.Cfg().MustGet(ctx, "server.port", 8000).Int()
	fmt.Println("server.port =", port)
}

多环境配置的常见做法是准备多份配置文件(如 config.yamlconfig.prod.yaml),再通过启动参数/环境变量切换框架实际加载的文件,即"同一套代码,不同环境配置",实施细节以官方文档为准。

注意点

  • g.Cfg().Get 返回 *gvar.Var,不要直接当字符串用,先调 .String()/.Int() 等。
  • 配置文件缺失通常不会启动报错,而是读到空值,排查时先确认配置文件路径。
  • 数据库、Redis 等组件配置也能放进 config.yaml,框架会按固定节点(databaseredis 等)自动读取,后续章节会用到。
  • 配置读取接口较多(如按文件、按环境变量的 Adapter),本章只覆盖默认文件配置。

小结

配置文件 + g.Cfg() 是 GoFrame v2 配置管理的基础用法;多环境切换能力让同一工程适配开发、测试、生产。更多配置项(热更新、多 Adapter 等)以官方文档 goframe.org 的配置管理章节为准。

笔记加载中…