对于 Go 语言开发者来说,在享受语言便利性的同时,最终编译的单一可执行文件也是我们所热衷的。但是,一旦遇到我们需要分发的东西不只有可执行文件的时候,事情就变得稍微有点复杂了,例如,需要分发个默认的配置文件;或者说是一个 Web 服务需要附带一些简单的 js/css 文件之类的。

当然,对于经验丰富的老司机们来说这都不是问题,例如 RH 系列的 RPM 是很多老司机们的选择,像我这样的新手也是觉得老司机们的这车开得好,可以很方便得管理一个分发包。但是,对于我们说的如果只有一点点文件,我就来打个 rpm 包,似乎有点脱裤放屁的感觉;同时,有时我们可能是在 OSX/Win 平台跑,这又缺乏一定的通用性。

基于很多考虑,有同学就觉得为啥不把这些简单的静态文件打包进可执行文件中,这样我还是只分发一个文件就可以了,其实我也挺喜欢这种方式的,好处就是很简单,带来的缺点当然也很明显,自然分发可执行文件就大了。Anyway,有得有失,不妨一起和我看一下这种方式是如何实现的。

go-bindata 介绍

在 Go 语言的 Awesome 中你可以看到很多静态打包库,但是,你却看不到 go-bindata,哈哈,这很奇怪哈。而且相比于 Awesome 中列举的这些库,go-bindata 明显更受欢迎,更流行。

go-bindata 很简单,设计理念也不难理解。它的任务就是讲静态文件封装在一个 Go 语言的 Source Code 里面,然后提供一个统一的接口,你通过这个接口传入文件路径,它将给你返回对应路径的文件数据。这也就是说它不在乎你的文件是字符型的文件还是字节型的,你自己处理,它只管包装。

瞎说无凭,这里就给出一个例子用于展示 go-bindata 的实际使用:

这里可以看到,Line 1 就是一个使用 go-bindata 的例子,这里讲 etc/config.json 通过 go-bindata 封装起来,然后下面就直接使用它,这样在运行的时候我就不用关注静态文件的具体位置了,我只认准 etc/config.json 就好了。

go-bindata 使用

首先,先介绍一下我的目录结构,因为这对于待会介绍 go-bindata 的使用有很大关系:

在根目录下我是定义了接口文件的,然后再 etc 目录下是放置我的配置文件:config.json,这也是我希望打包的配置文件,然后再 file/service.go 里面我是实现了需要进行文件读取的代码。

1. 使用 go-bindata 打包静态文件

前面说了,go-bindata 是将静态文件打包成 go 文件,所以第一步就是使用 go-bindata 读取配置文件,然后再生成 go 文件,具体的使用命令为:

$ go-bindata  -pkg etc -o etc/bindata.go etc/

关于 go-bindata 的参数,可以使用 go-bindata --help 查看。使用上面这条命令之后,会发现在 etc 目录下多了一个 bindata.go 文件,下一步我们就会使用它来代替 etc/config.json 文件。

使用静态文件

使用静态文件的代码也是很简单,我们只需要记住我们刚才生成 go 文件的相对路径,然后使用:

Asset("etc/config.json")

这样的语句就可以读取到静态文件了,整个 service 的示例代码为:

这里的 Line 5 就是使用刚才我们生成的 bindata.go 来读取静态文件的一段代码。

总结

这篇文章很简单得介绍了一下如何使用 go-bindata 来打包静态文件,同时在项目中如何使用这些静态文件。从这篇文章的介绍中应该可以看出 go-bindata 还是比较简单的,没有太复杂的方式,使用 go-bindata --help 也会发现参数还是相对比较少的,所以适合一些要求不复杂的场景。但是,这就意味着它的功能可能也是有限的,例如,默认是不支持 http.FileSystem 的,只能找其他插件支持。

Reference

  1. Go-Bindata

Go 语言打包静态文件的更多相关文章

  1. Go | Go 语言打包静态文件以及如何与Gin一起使用Go-bindata

    系列文章目录 第一章 Go 语言打包静态文件以及如何与Gin一起使用Go-bindata 目录 系列文章目录 前言 一.go-bindata是什么? 二.使用步骤 1. 安装 2. 使用 3. 读取文 ...

  2. pyinstaller深入使用,打包指定模块,打包静态文件

    1.标准用法: pyinstall  **.py  直接打包    pyinstall -F **.py  打包成单文件    pyinstall -W **.py  去掉控制台窗口,黑窗口    p ...

  3. 使用loader打包静态文件-样式2

    这篇我们了解下css-loader常用的配置项,要配置的话,use里面就不再是一个字符串了 // 打包模块不知道该怎么办,就去模块配置里面该怎么办 module: { // 规则 rules: [{ ...

  4. Django模板语言中静态文件路径的灵活写法

    如图,我们看到的时html页面中静态文件的路径,其中/static/是settings.py中的设置: 假设我们将settings.py中的/static/改变了,这样的话我们还需要将html中的/s ...

  5. Python--day66--Django模板语言关于静态文件路径的灵活写法

    静态文件路径的灵活写法: 正规的讲解: 静态文件相关 {% static %} {% load static %} <img src="{% static "images/h ...

  6. Grunt针对静态文件的压缩,版本控制打包方案

    在讲之前先谈谈大致步骤:安装nodejs -> 全局安装grunt -> 项目创建package.json --> 项目安装grunt以及grunt插件 -> 配置Gruntf ...

  7. springboot自定义静态文件目录,解决jar打包后修改页面等静态文件的问题

    1.问题 springboot开发时候,一般将文件放在resources目录,但是发布后想修订文件或是开发时候修改了文件内容一般需重新打包或者重启动才能达到效果: 2.原因 将资源文件打包入jar包, ...

  8. Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静态文件的加载load static),自定义simple_tag和inclusion_tag

    Django---MTV和MVC的了解,Django的模版语言变量和逻辑,常见的模板语言过滤器,自定义过滤器,CSRF了解,Django的母版(继承extends,块block,组件include,静 ...

  9. VUE打包好的文件部署让beego实现静态文件访问,如何用根目录来访问静态文件?

    最近的一个全栈项目,光伏云监控系统,后端使用beego框架,纯api,前端使用VUE2.0.项目地址:http://scada.ssechina.com:88/static 我把打包好的前端文件放到g ...

随机推荐

  1. IntelliJ IDEA(五) :Settings(中)

    上篇介绍了Settings中的Appearance & Behavior和Keymap,这篇继续,将介绍Editor,Plugins,Version Control. 一.Editor(编辑) ...

  2. 自学Zabbix3.5.7-监控项item-Applications

    Applications应用程序用于对逻辑组中的项目进行分组.例如我们要监控MySQL,我们可以将所有和MySQL相关的item放到这个应用程序中.例如MySQL的availability of My ...

  3. Python数据可视化——使用Matplotlib创建散点图

    Python数据可视化——使用Matplotlib创建散点图 2017-12-27 作者:淡水化合物 Matplotlib简述: Matplotlib是一个用于创建出高质量图表的桌面绘图包(主要是2D ...

  4. 《Spark大数据处理:技术、应用与性能优化》【PDF】

    内容简介 <Spark大数据处理:技术.应用与性能优化>根据最新技术版本,系统.全面.详细讲解Spark的各项功能使用.原理机制.技术细节.应用方法.性能优化,以及BDAS生态系统的相关技 ...

  5. javaWeb超链接(href)请求-特殊字符处理

    写在前面: 最近在项目中,遇到一个问题,在点击一个超链接时,页面报错.通过浏览器调试就可以知道发送的请求参数是不完整的,因为参数中含有特殊字符.所以就报错啦~~ 原代码,不能正确发送含有特殊字符的参数 ...

  6. springMVC(4)---生成excel文件并导出

    springMVC(4)---生成excel文件并导出 在开发过程中,需要将数据库中的数据以excel表格的方式导出. 首先说明.我这里用的是Apache的POI项目,它是目前比较成熟的HSSF接口, ...

  7. 关于C++函数返回局部对象的详细分析

    以前一直挺好奇的,C++是怎么在函数内返回一个局部对象的.因为按照我之前的想法,函数返回一个基本类型的值是通过存放到ecx实现的(关于浮点不了解),但是局部对象又是比较大的,很明显不能使用寄存器作为通 ...

  8. boost::assign(标准容器填充库)

    boost::assign通过对"+="和","的重载非常方便的填充标准容器(std::vector,std::set,std::list,std::map), ...

  9. [数据结构]C语言队列的实现

    我个人把链表.队列.栈分为一类,然后图.树分为一类.(串不考虑),分类的理由就是每一类有规律可循,即你能通过修改极少数的代码把链表变成队列.栈.(这里我们不考虑其他诸如设计模式等因素),因此本贴在讲完 ...

  10. ubuntu14.04 解决屏幕亮度无法调节的问题

    sudo gedit /etc/default/grub 在打开文件中找到 GRUB_CMDLINE_LINUX="" 改成 GRUB_CMDLINE_LINUX="ac ...