GF
的配置管理由gcfg
模块实现,gcfg
模块是并发安全的,仅提供配置文件读取功能,不提供数据写入/修改功能,支持的数据文件格式包括: JSON
、XML
、YAML/YML
、TOML
、INI
,项目中开发者可以灵活地选择自己熟悉的配置文件格式来进行配置管理。
默认读取执行文件所在目录及其下的config
目录,默认读取的配置文件为config.toml
;toml
类型文件也是默认的、推荐的配置文件格式,如果想要自定义文件格式,可以通过SetFileName
方法修改默认读取的配置文件名称(如:config.json
, cfg.yaml
, cfg.xml
, cfg.ini
等等)。
注:TOML大小写敏感,必须是UTF-8
编码;
配置管理器使用了缓存机制,当配置文件第一次被读取后会被缓存到内存中,下一次读取时将会直接从缓存中获取,以提高性能。同时,配置管理器提供了对配置文件的自动检测更新机制,当配置文件在外部被修改后,配置管理器能够即时地刷新配置文件的缓存内容。
配置管理器的自动检测更新机制是gf
框架特有的一大特色。
D:.
│ config_test.go -- 测试文件
│ go.mod
│ go.sum
│ main.go -- web自动更新配置演示
│
├─config
│ config.yaml -- 标准配置文件
│
└─configTest -- 定制目录和配置文件
config1.yaml
config2.yaml
viewpath: /home/www/templates/ # 模板引擎目录
name: hello world!
database: # MySQL数据库配置
default:
- host: 127.0.0.1
port: "3306"
user: root
pass: "123456"
name: test1
type: mysql
role: master
charset: utf8
priority: "1"
- host: 127.0.0.1
port: "3306"
user: root
pass: "123456"
name: test2
type: mysql
role: master
charset: utf8
priority: "1"
redis: # Redis数据库配置
disk: 127.0.0.1:6379,0
cache: 127.0.0.1:6379,1
study: "hello study"
study1: "hello study1"
config2: "111"
package main
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
func main() {
s := g.Server()
// 默认路径
s.BindHandler("/", func(r *ghttp.Request) {
name, err := g.Cfg().Get(r.GetCtx(), "name")
if err != nil {
r.Response.Writeln(err.Error())
r.Exit()
}
r.Response.Writeln("配置", name)
r.Response.Writeln("Welcome GoFrame!")
})
s.SetPort(8199)
s.Run()
}
package main
import (
"fmt"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gcfg"
"github.com/gogf/gf/v2/os/gctx"
"testing"
)
// 基本配置使用
func TestConfig(t *testing.T) {
ctx := gctx.New()
// 默认当前路径或者config路径,默认文件config.yaml
// /home/www/template/
fmt.Println(g.Config().Get(ctx, "viewpath"))
fmt.Println(g.Cfg().Get(ctx, "viewpath"))
// 127.0.0.1:6379,1
c := g.Cfg()
// 分组方式
fmt.Println(c.Get(ctx, "redis.cache"))
// 数组方式:test2
fmt.Println(c.Get(ctx, "database.default.1.name"))
}
// 设置路径
func TestConfig2(t *testing.T) {
ctx := gctx.New()
// 设置加载文件,默认name为default
// 设置路径
g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetPath("configTest")
// 设置加载文件
g.Cfg().GetAdapter().(*gcfg.AdapterFile).SetFileName("config1.yaml")
// 打印测试
fmt.Println(g.Cfg().Get(ctx, "viewpath"))
fmt.Println(g.Cfg().Get(ctx, "study"))
fmt.Println(g.Cfg().Get(ctx, "study1"))
fmt.Println(g.Cfg().Get(ctx, "config2"))
// 新的name就是新的实例
g.Cfg("name").GetAdapter().(*gcfg.AdapterFile).SetPath("configTest")
g.Cfg("name").GetAdapter().(*gcfg.AdapterFile).SetFileName("config2.yaml")
fmt.Println(g.Cfg("name").Get(ctx, "viewpath"))
fmt.Println(g.Cfg("name").Get(ctx, "study"))
fmt.Println(g.Cfg("name").Get(ctx, "study1"))
fmt.Println(g.Cfg("name").Get(ctx, "config2"))
}
module gf_config
go 1.21
require github.com/gogf/gf/v2 v2.6.2