使用go-bindata将文件编译进二进制
文章发布较早,内容可能过时,阅读注意甄别。
在日常开发工作中,有一些配置文件之类的静态内容我们是剥离在项目之外存在的,而如果想要实现该项目打出来的二进制包能够不依赖本地静态配置,随处运行,针对这个问题,已经有不少前人思考过了,这篇文章就是要介绍一个工具:
- name: go-bindata
desc: 将静态文件编译到二进制
avatar: https://avatars2.githubusercontent.com/u/416130?s=460&u=8753e86600e300a9811cdc539aa158deec2e2724&v=4
link: https://github.com/go-bindata/go-bindata
bgColor: "#ffa8a8"
1
2
3
4
5
2
3
4
5
# 1,安装
此工具使用时依赖命令行对文件进行处理,因此我们先安装此包:
$ go get -u github.com/go-bindata/go-bindata/...
1
如果你的 go 版本已经来到了 1.17,那么可能会遇到如下报错:
$ go get -u github.com/go-bindata/go-bindata/...
go: downloading github.com/go-bindata/go-bindata v1.0.0
go get: installing executables with 'go get' in module mode is deprecated.
Use 'go install pkg@version' instead.
For more information, see https://golang.org/doc/go-get-install-deprecation
or run 'go help get' or 'go help install'.
1
2
3
4
5
6
2
3
4
5
6
此时可将命令更改如下(参考 (opens new window)):
go install -a -v github.com/go-bindata/go-bindata/...@latest
1
安装完成之后,会在本地 GOPATH 目录下多一个二进制文件,我们将其放到系统环境变量中,以备方便使用。
$ ls $GOPATH/bin/go-bindata
/Users/liqilong/eryajf/letsgo/project/bin/go-bindata
$ cp $GOPATH/bin/go-bindata /usr/local/bin
1
2
3
4
2
3
4
执行如下命令验证安装成功:
$ go-bindata -version
go-bindata 3.1.3 (Go runtime go1.14.4).
Copyright (c) 2010-2013, Jim Teeuwen.
1
2
3
2
3
# 2,使用
此时我们有一个配置文件如下:
$ cat .env
USER: eryajf
PASS: eryajf.net
1
2
3
2
3
原来在本地读取的时候,结合viper
包,我们的姿势如下:
package main
import (
"fmt"
"log"
"github.com/spf13/viper"
)
func init() {
viper.SetConfigFile(".env") // 读取yaml配置文件
if err := viper.ReadInConfig(); err != nil {
if _, ok := err.(viper.ConfigFileNotFoundError); ok {
// Config file not found; ignore error if desired
log.Println("no such config file")
} else {
// Config file was found but another error was produced
log.Println("read config error")
}
log.Fatal(err) // 读取配置文件失败致命错误
}
}
func main() {
fmt.Println("用户为:", viper.GetString("USER"))
fmt.Println("密码为:", viper.GetString("PASS"))
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
运行可得结果如下:
$ go run main.go
用户为: eryajf
密码为: eryajf.net
1
2
3
2
3
现在我们把配置文件通过 go-bindata 准换成一个 go 文件,操作如下:
$ go-bindata -o=./public/config.go -pkg=public .env
1
-o
:指定打包后生成的 go 文件路径-pkg
:指定打包后生成的 go 文件的包名.env
:指定将要打包的文件,也可以是一个目录
打包命令执行后,可以看到生成了一个 public 目录,而且多了一个 config.go 文件。
此时主 main 包改造如下:
package main
import (
"bytes"
"fmt"
"notify-demo/public"
"github.com/spf13/viper"
)
func init() {
fileobj, err := public.Asset(".env")
if err != nil {
fmt.Printf("Asset file err:%v\n", err)
return
}
viper.SetConfigType("yaml")
err = viper.ReadConfig(bytes.NewBuffer(fileobj))
if err != nil {
fmt.Printf("Read Config err:%v\n", err)
return
}
}
func main() {
fmt.Println("用户为:", viper.GetString("USER"))
fmt.Println("密码为:", viper.GetString("PASS"))
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
运行可得结果:
$ go run main.go
用户为: eryajf
密码为: eryajf.net
1
2
3
2
3
这样即便我们把本地的.env 删除,也不会影响项目运行了。
上次更新: 2024/12/05, 21:39:23