二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • Shell编程

  • Go编程笔记

    • 开发技巧

    • 库包研究

      • 使用gorm进行联合查询的整理总结
      • 一个ftp客户端的封装
      • 使用go-bindata将文件编译进二进制
        • 1,安装
        • 2,使用
      • go-gitlab包源码探寻与心得
      • 利用cobra库快速开发类似kubectl一样的命令行工具
      • 使用MongoDB官方go库操作MongoDB
      • 再探-利用gorm自身提供的方法实现MySQL中数据关联的能力
      • 使用retry-go给项目添加重试机制
      • go-cache包的使用简析
      • 利用gorm自身提供的方法实现存在更新不存在则创建的能力
      • 近期关于cobra库的一些实践心得总结
    • 个人项目

  • 前端编程笔记

  • Go学习笔记

  • Vue-21年学习笔记

  • Vue-22年重学笔记

  • 编程世界
  • Go编程笔记
  • 库包研究
二丫讲梵
2021-07-13
目录

使用go-bindata将文件编译进二进制

文章发布较早,内容可能过时,阅读注意甄别。

在日常开发工作中,有一些配置文件之类的静态内容我们是剥离在项目之外存在的,而如果想要实现该项目打出来的二进制包能够不依赖本地静态配置,随处运行,针对这个问题,已经有不少前人思考过了,这篇文章就是要介绍一个工具:

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

# 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

此时可将命令更改如下(参考 (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

执行如下命令验证安装成功:

$ go-bindata -version
go-bindata 3.1.3 (Go runtime go1.14.4).
Copyright (c) 2010-2013, Jim Teeuwen.
1
2
3

# 2,使用

此时我们有一个配置文件如下:

$ cat .env
USER: eryajf
PASS: eryajf.net
1
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

运行可得结果如下:

$ go run main.go
用户为: eryajf
密码为: eryajf.net
1
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

运行可得结果:

$ go run main.go
用户为: eryajf
密码为: eryajf.net
1
2
3

这样即便我们把本地的.env 删除,也不会影响项目运行了。

微信 支付宝
#go
上次更新: 2024/06/13, 22:13:45
一个ftp客户端的封装
go-gitlab包源码探寻与心得

← 一个ftp客户端的封装 go-gitlab包源码探寻与心得→

最近更新
01
记录二五年五一之短暂回归家庭
05-09
02
学习周刊-总第210期-2025年第19周
05-09
03
学习周刊-总第209期-2025年第18周
05-03
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式