go-bindata + hcl 集成

go-bindata 可以方便的将静态资源潜入到golang 应用中,hcl 是一个很不错的配置语言,以下是一个简单的集成,比较适合
配置基本不需要变动的

环境说明

一个简单的基于hcl 的job 配置定义,然后通过go-bindata 将配置合并,然后代码引用

  • job hcl 定义
 
// Job job
type Job struct {
    Type string     `hcl:",label"`
    SQLs []*SQLType `hcl:"sqls,block"`
}
// SQLType SqlType
type SQLType struct {
    Name    string `hcl:",label"`
    SQLType string `hcl:"sqltype"`
    SQL     string `hcl:"sql"`
}
  • 参考hcl 内容
job db  {
     sqls database1{
        sqltype = "slowquery1"
        sql = <<SQL
            select * from users
        SQL
     }
     sqls database2{
        sqltype = "slowquery2"
        sql = <<SQL
            select * from users
        SQL
     }
}
job http  {
     sqls database3{
        sqltype = "slowquery3"
        sql = <<SQL
            select * from users
        SQL
     }
     sqls database4{
        sqltype = "slowquery4"
        sql = <<SQL
            select * from users
        SQL
     }
}
  • go-bindat 集成静态配置
go-bindata -pkg conf jobsconf
  • 代码引用
    因为生成的代码中已经提供了方便的文件操作,我们只需要简单的替换就可以解决了,以前基于文件的操作改动很少
 
package main
import (
    "encoding/json"
    "log"
    "gihub.com/rongfengliang/hclv2-learning/cmd/v10/conf"
    "github.com/hashicorp/hcl/v2/hclsimple"
)
// Job job
type Job struct {
    Type string     `hcl:",label"`
    SQLs []*SQLType `hcl:"sqls,block"`
}
// SQLType SqlType
type SQLType struct {
    Name    string `hcl:",label"`
    SQLType string `hcl:"sqltype"`
    SQL     string `hcl:"sql"`
}
func main() {
    var myjobs map[string][]*Job = make(map[string][]*Job)
    //  conf 为生成的golang 代码
    files, err := conf.AssetDir("jobsconf")
    if err != nil {
        log.Println("#err :" + err.Error())
    } else {
        for _, file := range files {
            log.Println("file name:" + file)
            var config struct {
                Jobs []*Job `hcl:"job,block"`
            }
            jobconfs, _ := conf.Asset("jobsconf/" + file)
            err = hclsimple.Decode(file, jobconfs, nil, &config)
            if err != nil {
                log.Println("#err :" + err.Error())
            }
            myjobs[file] = config.Jobs
        }
    }
    if err != nil {
        log.Println("some err: " + err.Error())
    }
    for _, item := range myjobs {
        for _, job := range item {
            v, _ := json.Marshal(&job)
            log.Printf("message: %s 
", string(v))
        }
    }
}
 

说明

以上是一个简单的集成,我们基于hcl 以及go-bindata可以方便的进行软件配置以及二进制包的分发,类似的工具还是很多的

参考资料

https://github.com/go-bindata/go-bindata
https://github.com/hashicorp/hcl/tree/hcl2
https://github.com/rongfengliang/hclv2-learning

原文地址:https://www.cnblogs.com/rongfengliang/p/13269040.html