少于 1 分钟阅读

最近离职了,在家写点代码,发现Yaml文件转Go的结构体的工具好少,我又比较习惯使用Yaml作为配置文件。

早写晚写都得写,就趁早封装一个吧。

先在网上找找看,发现一个库还挺不错:yaml2go

再看看他的cli,我希望集成在我的Makefile里,可以基于Yaml文件快速的重新生成go结构体文件

结果,他的cli版本是这样的: 原库cli代码 原库cli代码

这里有几个问题:

  • 1.基于i/o,不能定制化参数
  • 2.输出的文件内,没有包名等,不满足我的要求,也没法改
  • 3.无法通过go install 快速安装,因为这里的代码和yaml2go的源码是在一起的
  • 4.生成的根结点结构体名称必须为Yaml2Go,这个说实话有点太呆了

所以就自己封装一个吧。

cobra加一个root入口,加几个定制化的参数:

  • 输入文件路径
  • 输出文件路径
  • 根结构体名
  • 生成文件的包名

yaml2go-cli_param

我封装的工具源码在这里

使用方式也很简单:

./yaml2go-cli -i test/test.yaml -o test/test.bean.file

原始的Yaml文件:

port: 8080

log:
  level: debug
  path: log

db:
  path: db
  name: map

生成出的Golang结构体文件:

package main

// Default
type Default struct {
	Log  Log `yaml:"log"`
	Db   Db  `yaml:"db"`
	Port int `yaml:"port"`
}

// Log
type Log struct {
	Level string `yaml:"level"`
	Path  string `yaml:"path"`
}

// Db
type Db struct {
	Path string `yaml:"path"`
	Name string `yaml:"name"`
}

当然,你也可以使用-p 包名指定包名,-s 结构体名指定根结构体名称。

挺方便的,这样就可以在自己的Makefile上集成一个make yaml命令,使用yaml文件生成go文件,免去手敲的麻烦:

yaml:
	go install github.com/Icemap/yaml2go-cli@latest
	yaml2go-cli -i config/config.yaml -o config/config.bean.go -p config -s Config

Done