zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Android UI性能优化详解
    Android开发中一些被冷落但却很有用的类和方法
    Android开发:Translucent System Bar 的最佳实践
    让动画不再僵硬:Facebook Rebound Android动画库介绍
    Android Touch事件传递机制
    转载爱哥自定义View系列--Canvas详解
    Android最佳实践指南
    Android网络请求心路历程
    转载爱哥自定义View系列--文字详解
    ORM是什么?
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/13269040.html
Copyright © 2011-2022 走看看