Skip to content

Latest commit

 

History

History
170 lines (136 loc) · 4.14 KB

06.goframe配置文件.md

File metadata and controls

170 lines (136 loc) · 4.14 KB

GoFrame配置文件

一、配置文件介绍

GF的配置管理由gcfg模块实现,gcfg模块是并发安全的,仅提供配置文件读取功能,不提供数据写入/修改功能,支持的数据文件格式包括: JSONXMLYAML/YMLTOMLINI,项目中开发者可以灵活地选择自己熟悉的配置文件格式来进行配置管理。

默认读取执行文件所在目录及其下的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

config.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

config1.toml

study: "hello study"
study1: "hello study1"

config2.toml

config2: "111"

main.go

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()

}

config_test.go

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"))
}

go.mod

module gf_config

go 1.21

require github.com/gogf/gf/v2 v2.6.2