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"
"/rongfengliang/hclv2-learning/cmd/v10/conf"
"/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 \r\n", string(v))
}
}
}
说明
以上是一个简单的集成,我们基于hcl 以及go-bindata可以方便的进行软件配置以及二进制包的分发,类似的工具还是很多的