GoFrame的配置管理由gcfg组件实现,gcfg组件的所有方法是并发安全的。gcfg组件采用接口化设计,默认提供的是基于文件系统的接口实现。
GoFrame
gcfg
使用方式:
import "github.com/gogf/gf/v2/os/gcfg"
接口文档:
https://pkg.go.dev/github.com/gogf/gf/v2/os/gcfg
gcfg组件具有以下显著特性:
yaml/toml/json/xml/ini/properties
强哥我在看示例代码,没有找到加载config下的config.example.toml的相关逻辑,这块怎么实现的啊。还有就是也没看到数据库相关的配置在哪初始化连接的。
你这家伙,分明就是不专心看书嘛,示例代码第一行不就是了吗, SetFileName()
还有个问题,配置文件之间有没有继承关系,比如我有一套基础配置,又根据ENV不同会重写一些IP或者端口之类的配置,例如base.toml 和 dev.toml,base里定义了各个环境中通用的配置, env.toml定义各个环境中需要重写的配置,这样有办法支持么
目前不支持呢。不过有考虑后续会将gcfg的核心功能做成接口化,这样开发者可以自定义配置读取。
这个配置文件继承 你看这样行不行?
1.读取base.toml
2.读取dev.toml
3.合并2个配置文件的内容
我们做法是只读dev.toml ,里面有一个关键字作为他的父文件,以此类推。感觉也还好
能具体说说是怎么操作的吗?谢谢🙏
可以参考 viper,不过它的实现机制是按优先级逐个读每个文件里的 key,匹配到就退出,不利于整结构读取。
反馈一个文档错误
假如我们的执行程序文件为main,那么可以通过以下方式修改配置管理器的配置文件目录(Linux下):
main
Linux
g.Cfg().SetFileName("config.prod.toml")
看这段文字描述,我在main.go文件中加入了,这行代码,然而并不生效
然后我在boot.go中添加,是可以正常工作的
// 用于应用初始化。 func init() { g.Config().SetFileName("config.prod.toml") s := g.Server() //开启debug模式,打印更多调试信息,建议在开发环境开启 g.SetDebug(true) s.Plugin(&swagger.Swagger{}) }
文件的相对路径没有设置对的, 它会报这样的错:
[ERRO] [gcfg] cannot find config file "config.fuck.toml" in resource manager or the following paths
1. C:\Users\huang\Desktop\GFdemo22. C:\Users\huang\Desktop\GFdemo2\config
我的配置文件是gfdemo2/config/fuck.toml, 灵活思考,把
// var ConfigObj2 = g.Cfg().SetFileName("config.fuck.toml")
改成
var ConfigObj2 = g.Cfg().SetFileName("fuck.toml")
就好了.
另外, 好像这个方法不能添加绝对路径的配置文件来着?
评论区编辑器没有markdown...
支持相对路径和绝对路径,任何开发语言在设置相对路径的时候新手往往容易出错。
是你配置错了。
g.Cfg().SetFileName("config.fuck.toml") 是找Desktop\GFdemo2\config.fuck.toml 或 Desktop\GFdemo2\config\config.fuck.toml
g.Cfg().SetFileName("fuck.toml") 是找Desktop\GFdemo2\fuck.toml 或 Desktop\GFdemo2\config\fuck.toml
好的,我看看,因为是初次接触所以有很多知其然不知其所以然的地方,哈哈
请问在程序运行中切换了配置文件。能刷新已经使用的 g.DB()的配置吗?
g.DB()
配置会自动刷新到内存中。但数据库比较特殊一些,如果采用dao操作连接对象不会刷新,需要重新进程。如果是采用g.DB()操作数据库,会刷新连接对象。
dao
在做自动化安装功能,将 server 和 生成工具做再一个exe里,出现dao起始加载不到config的问题,才有此疑问。
目前打包默认config到exe。在install时生成默认config 并用shell 重新执行程序解决问题
请问平滑重启功能应该可以刷新 DAO 连接对象吧?我看平滑重启那一部分说的是重启后 pid 会改变。
有老哥解答下吗,怎么这么难用啊。在win打了win,linux的包,win双击能正常启动,端口没问题。linux启动端口是80。找了一遍说什么配置,然后又启动加配置。如下:
[root@localhost office]# ./officeView --gf.gcfg.file /root/app/office/config.toml 2021/07/27 10:11:24 init ...2021-07-27 10:11:24.223 [FATA] SetServerRoot failed: cannot find file/folder "public" in following paths:1. /root/app/office Stack:1. office_view/router.init.0 C:/Users/Administrator/IdeaProjects/xxx/svn/office_view/router/router.go:10
特么的,烦死了,不想学了,gf版本为v1.6.4,
1.我想问问如何改端口呀,打出来的win双击端口是配置里边的。linux该怎么改
2.还有我想问问在win上打的包,linux运行为啥会出现win的路径。
算了,我歇逼了
新建一个public空目录试试
C:/Users/Administrator/IdeaProjects/xxx/svn/office_view/router/router.go:10
这个路径是错误堆栈信息,是打包时候的文件路径,用来告诉你在哪个文件哪一行出问题了。
把心静下来慢慢学。
这代码都是自动生成的func init() { s := g.Server() //第10行 s.Group("/", func(group *ghttp.RouterGroup) { group.GET("/hello", api.Hello.Index) group.GET("/officeView/:name", api.Office.Get) })}
你可能没细看文档项目配置。
也需要好好学习一下如何阅读错误信息,错误处理-堆栈特性。
其实错误提示也挺明显的,就是在linux下运行的时候没有找到你的配置文件中所指定的serverRoot文件夹。
serverRoot = "public"
等于我打包的时候还得把config下的配置文件拷贝到public下边呀?
在运行的目录下面建一个public目录
我去,怎么端口还是80啊,没效果
SERVER | DOMAIN | ADDRESS | METHOD | ROUTE | HANDLER | MIDDLEWARE ----------|---------|---------|--------|-------------------|------------------------------------------|------------- default | default | :80 | GET | /hello | office_view/app/api.(*helloApi).Index-fm |
请问配置文件中的数据库密码,能像java那样,加密吗?
试了下,Linux环境下要使用 export GF_GCFG_FILE=config.prod.toml; ./main 配置文件才生效。
我刚开始学习GoFrame,请问现在支不支持在配置文件里使用环境变量?谢谢
v2可以,哈哈哈
if len(masterList) < 1 { return nil, gerror.NewCode(gcode.CodeInvalidConfiguration, "at least one master node configuration's need to make sense") } if len(slaveList) < 1 { slaveList = masterList } if master { return getConfigNodeByWeight(masterList), nil } else { return getConfigNodeByWeight(slaveList), nil }
if node, err := getConfigNodeByGroup(groupName, true); err == nil { 这里调用上面代码块的函数,传入的master参数始终为true,没法获取slave的配置吧?
支持配置文件自动检测热更新特性,这个 热更新 怎么配置,我搜索了一下没找到示例,是我的姿势不对吗?
直接改配置文件的内容就可以
33 Comments
ayamzh
强哥我在看示例代码,没有找到加载config下的config.example.toml的相关逻辑,这块怎么实现的啊。还有就是也没看到数据库相关的配置在哪初始化连接的。
黄昌淮
你这家伙,分明就是不专心看书嘛,示例代码第一行不就是了吗, SetFileName()
ayamzh
还有个问题,配置文件之间有没有继承关系,比如我有一套基础配置,又根据ENV不同会重写一些IP或者端口之类的配置,例如base.toml 和 dev.toml,base里定义了各个环境中通用的配置, env.toml定义各个环境中需要重写的配置,这样有办法支持么
郭强
目前不支持呢。不过有考虑后续会将
gcfg
的核心功能做成接口化,这样开发者可以自定义配置读取。刘羽禅
这个配置文件继承 你看这样行不行?
1.读取base.toml
2.读取dev.toml
3.合并2个配置文件的内容
ayamzh
我们做法是只读dev.toml ,里面有一个关键字作为他的父文件,以此类推。感觉也还好
LeeEcho
能具体说说是怎么操作的吗?谢谢🙏
杨延庆
可以参考 viper,不过它的实现机制是按优先级逐个读每个文件里的 key,匹配到就退出,不利于整结构读取。
刘羽禅
反馈一个文档错误
假如我们的执行程序文件为
main
,那么可以通过以下方式修改配置管理器的配置文件目录(Linux
下):看这段文字描述,我在main.go文件中加入了,这行代码,然而并不生效
然后我在boot.go中添加,是可以正常工作的
黄昌淮
文件的相对路径没有设置对的, 它会报这样的错:
[ERRO] [gcfg] cannot find config file "config.fuck.toml" in resource manager or the following paths
1. C:\Users\huang\Desktop\GFdemo2
2. C:\Users\huang\Desktop\GFdemo2\config
我的配置文件是gfdemo2/config/fuck.toml, 灵活思考,把
// var ConfigObj2 = g.Cfg().SetFileName("config.fuck.toml")
改成
var ConfigObj2 = g.Cfg().SetFileName("fuck.toml")
就好了.
另外, 好像这个方法不能添加绝对路径的配置文件来着?
评论区编辑器没有markdown...
郭强
支持相对路径和绝对路径,任何开发语言在设置相对路径的时候新手往往容易出错。
海亮
是你配置错了。
g.Cfg().SetFileName("config.fuck.toml") 是找Desktop\GFdemo2\config.fuck.toml 或 Desktop\GFdemo2\config\config.fuck.toml
g.Cfg().SetFileName("fuck.toml") 是找Desktop\GFdemo2\fuck.toml 或 Desktop\GFdemo2\config\fuck.toml
黄昌淮
好的,我看看,因为是初次接触所以有很多知其然不知其所以然的地方,哈哈
杨率帅
请问在程序运行中切换了配置文件。能刷新已经使用的
g.DB()
的配置吗?郭强
配置会自动刷新到内存中。但数据库比较特殊一些,如果采用
dao
操作连接对象不会刷新,需要重新进程。如果是采用g.DB()
操作数据库,会刷新连接对象。杨率帅
在做自动化安装功能,将 server 和 生成工具做再一个exe里,出现dao起始加载不到config的问题,才有此疑问。
目前打包默认config到exe。在install时生成默认config 并用shell 重新执行程序解决问题
Rainshaw
请问平滑重启功能应该可以刷新 DAO 连接对象吧?我看平滑重启那一部分说的是重启后 pid 会改变。
鼻屎拌饭加蛋
有老哥解答下吗,怎么这么难用啊。在win打了win,linux的包,win双击能正常启动,端口没问题。linux启动端口是80。找了一遍说什么配置,然后又启动加配置。如下:
[root@localhost office]# ./officeView --gf.gcfg.file /root/app/office/config.toml
2021/07/27 10:11:24 init ...
2021-07-27 10:11:24.223 [FATA] SetServerRoot failed: cannot find file/folder "public" in following paths:
1. /root/app/office
Stack:
1. office_view/router.init.0
C:/Users/Administrator/IdeaProjects/xxx/svn/office_view/router/router.go:10
特么的,烦死了,不想学了,gf版本为v1.6.4,
1.我想问问如何改端口呀,打出来的win双击端口是配置里边的。linux该怎么改
2.还有我想问问在win上打的包,linux运行为啥会出现win的路径。
鼻屎拌饭加蛋
算了,我歇逼了
LeeEcho
新建一个public空目录试试
海亮
C:/Users/Administrator/IdeaProjects/xxx/svn/office_view/router/router.go:10
这个路径是错误堆栈信息,是打包时候的文件路径,用来告诉你在哪个文件哪一行出问题了。
把心静下来慢慢学。
鼻屎拌饭加蛋
海亮
你可能没细看文档项目配置。
也需要好好学习一下如何阅读错误信息,错误处理-堆栈特性。
其实错误提示也挺明显的,就是在linux下运行的时候没有找到你的配置文件中所指定的serverRoot文件夹。
鼻屎拌饭加蛋
等于我打包的时候还得把config下的配置文件拷贝到public下边呀?
海亮
在运行的目录下面建一个public目录
鼻屎拌饭加蛋
我去,怎么端口还是80啊,没效果
SERVER | DOMAIN | ADDRESS | METHOD | ROUTE | HANDLER | MIDDLEWARE
----------|---------|---------|--------|-------------------|------------------------------------------|-------------
default | default | :80 | GET | /hello | office_view/app/api.(*helloApi).Index-fm |
yzl
请问配置文件中的数据库密码,能像java那样,加密吗?
LeeEcho
试了下,Linux环境下要使用 export GF_GCFG_FILE=config.prod.toml; ./main 配置文件才生效。
Raymond
我刚开始学习GoFrame,请问现在支不支持在配置文件里使用环境变量?谢谢
aries
v2可以,哈哈哈
JKing
feiyu
支持配置文件自动检测热更新特性,这个 热更新 怎么配置,我搜索了一下没找到示例,是我的姿势不对吗?
糖水不加糖
直接改配置文件的内容就可以