美文网首页Golang语言知识库
Golang快速开发框架——增加系统配置读取组件viper(二)

Golang快速开发框架——增加系统配置读取组件viper(二)

作者: cn華少 | 来源:发表于2021-12-26 21:40 被阅读0次

    Golang快速开发框架——增加系统配置读取组件viper(二)

    背景

    知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。

    知识分享系列目前包含Java、Golang、Linux、Docker等等。

    开发环境

    • 系统:windows10
    • 语言:Golang
    • golang版本:1.17
    • 代码仓库:FastDevelopGo

    内容

    日常我们使用golang开发项目时经常需要使用一些基础组件,每次新建较为繁琐,现有市面上的感觉不太适合自己,因此决定自己搭建一套,同时开源出来分享给大家使用,欢迎大家提出各种需求。下面我们开始对于该框架进行继续完善,本节我们要完成的需求是:当启动时没有系统配置文件自动创建该文件或直接使用默认文件进行启动,代码如下:
    不清楚上一节内容的小伙伴可以到知识分享之Golang——和我一起搭建一个快速开发框架(一)这里查看。

    1、启动代码修改如下

    package begin
    
    import (
        "FastDevelopGo/src/base/util"
        "bufio"
        "flag"
        "fmt"
        "github.com/spf13/viper"
        "os"
        "strings"
    )
    
    var (
        SysConfigDir      string
        SysConfigName     string
        SysConfigType     string
        SysConfigFilePath string
    )
    
    // Start 主配置启动函数
    func Start() error {
        SysConfigDir = *flag.String("d", "./conf/", "配置一个启动配置文件存放目录,默认:./conf/")
        SysConfigName = *flag.String("n", "sys", "配置启动配置文件名称,默认:sys")
        SysConfigType = *flag.String("t", "toml", "配置启动配置文件类型,默认:toml")
        flag.Parse()
        // 初始赋值配置文件地址
        SysConfigFilePath = SysConfigDir + "/" + SysConfigName + "." + SysConfigType
        // 加载启动配置
        if configLoad() {
            //TODO 配置加载正常,可以继续向下进行
        } else {
            return fmt.Errorf("发生了一个致命错误,程序结束 \n")
        }
        return nil
    }
    
    //configLoad 配置文件加载内部函数
    func configLoad() (state bool) {
        // 设定读取名称
        viper.SetConfigName(SysConfigName)
        // 设定配置文件类型
        viper.SetConfigType(SysConfigType)
        // 设定扫描目录
        viper.AddConfigPath(SysConfigDir)
        // 设置默认配置
        viper.SetDefault("sys", map[string]string{
            "conf_type": "toml",
            "conf_dir":  "conf/app",
            "conf_name": "base",
        })
        // 读取配置文件
        if err := viper.ReadInConfig(); err != nil {
            if _, ok := err.(viper.ConfigFileNotFoundError); ok {
                reader := bufio.NewReader(os.Stdin)
                fmt.Println("没有找到配置文件,请选择启动方式(1、2、3、)")
                fmt.Println("1、自动创建配置文件与文件夹并启动")
                fmt.Println("2、不创建配置文件,直接依据默认配置启动")
                fmt.Println("3、退出")
                fmt.Print("-> ")
                isContinue, err := reader.ReadString('\n')
                if err != nil {
                    state = false
                    panic(fmt.Errorf("发生致命错误: %w \n", err))
                } else {
                    // 转换为小写并去除前后空格
                    isContinue = strings.TrimSpace(strings.ToLower(isContinue))
                    // 判断输入是否正确
                    if isContinue == "1" || isContinue == "1、" || isContinue == "1." {
                        // 根据是否存在目录进行创建需要的目录
                        if _, err := util.IsExistAndCreateDir(SysConfigDir); err == nil {
                            // 2、进行创建需要的配置文件
                            err := viper.WriteConfigAs(SysConfigFilePath)
                            if err != nil {
                                state = false
                                panic(fmt.Errorf("致命错误:%w \n", err))
                            } else {
                                state = true
                            }
                        } else {
                            state = false
                            panic(fmt.Errorf("创建文件夹时发生致命错误:%w \n", err))
                        }
                    } else if isContinue == "2" || isContinue == "2、" || isContinue == "2." {
                        // 直接使用默认配置,不再生成配置文件,由于上述默认已经在最初时初始化了,因此不需要再进行重复操作
                        state = true
                    } else {
                        // 退出
                        state = false
                    }
                }
            } else {
                state = false
                // 找到配置文件,但产生了另一个错误
                panic(fmt.Errorf("配置文件致命错误: %w \n", err))
            }
        } else {
            state = true
        }
        fmt.Println(viper.Get("sys."))
        return state
    }
    

    2、创建一个工具类

    package util
    
    import (
        "os"
    )
    
    // IsExistAndCreateDir 创建文件夹
    // path 文件夹存放地址
    // @return bool 是否成功执行
    // @return err 异常
    func IsExistAndCreateDir(path string) (bool, error) {
        // 判断文件夹是否存在
        if _, err := os.Stat(path); os.IsNotExist(err) {
            // 创建文件夹,注意这里给的权限时777,可以将这个参数提取出来作为参数传入。
            if err := os.Mkdir(path, os.ModePerm); err != nil {
                return false, err
            } else {
                return true, nil
            }
        } else {
            return true, err
        }
    }
    
    

    3、进行整体测试

    image.png

    成功在运行所在位置下创建了默认conf文件夹和其对应的基础配置文件。

    至此本节结束,下一节我们将对于这个框架增加日志部分,这样我们就可以在日常业务开发和框架开发时直接使用日志了,欢迎大家持续关注并踊跃提出需求。

    注:
    这个框架我的初步想法时后续增加可视化页面、代码快速生成模块、项目框架快速生成模块等等,有其他需求想法的小伙伴欢迎在评论区留言或直接到代码仓库中提出宝贵的issue

    欢迎大家积极start,大家的关注是我最大的动力。

    本文声明:
    88x31.png
    知识共享许可协议
    本作品由 cn華少 采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可。

    相关文章

      网友评论

        本文标题:Golang快速开发框架——增加系统配置读取组件viper(二)

        本文链接:https://www.haomeiwen.com/subject/zrnrqrtx.html