对于 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. 蓝牙核心技术概述(五):蓝牙协议规范(irOBEX、BNEP、AVDTP、AVCTP)

    关键词:蓝牙核心技术协议  irDA BNEP  AVDTP AVCTP 作者:xubin341719(欢迎转载,请注明作者,请尊重版权,谢谢! )欢迎指正错误,共同学习.共同进步!! 下载链接:Bl ...

  2. Docker for Windows 使用入门

    欢迎来到Docker for Windows! Docker是用于创建Docker应用程序的完整开发平台,Docker for Windows是在Windows系统上开始使用Docker的最佳方式. ...

  3. String、StringBuilder和StringBuffer类

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  4. 《高性能MySQL(第3版)》【PDF】下载

    内容简介 <高性能mysql(第3版)>是mysql 领域的经典之作,拥有广泛的影响力.第3版更新了大量的内容,不但涵盖了最新mysql5.5版本的新特性,也讲述了关于固态盘.高可扩展性设 ...

  5. mysql主从备份+keepalived自动切换

    数据库这一层需要做到避免单点故障可以是主从备份和主主备份,主主备份可能有性能损耗和数据同步的问题.这里记录下主从备份, mysql进行备份之前确保mysql的版本是一样的,我这里用的都是mysql5. ...

  6. Error:Execution failed for task ':app:mergeDebugResources'. > Crunching Cruncher ******.9.png

    有时候在Android Studio导入Eclipse项目时,会出现Error:Execution failed for task ':app:mergeDebugResources'. > C ...

  7. windos10安装mongodb并配置

    想了想还是把这个写上吧,毕竟网上的教程有不少坑的. 首先下载mongodb,如果你嫌官网慢,那么你可以去我的百度云下载 链接:http://pan.baidu.com/s/1pKEWTBX 密码:v3 ...

  8. 无 new 构造与链式调用

    无 new 构造 最简单的想法 (function(window) { var jQuery = function() { return new _jQuery(); }; var _jQuery = ...

  9. JDK 1.8 源码阅读和理解

    根据 一篇文章教会你,如何做到招聘要求中的“要有扎实的Java基础” 的指引,决定开始阅读下JDK源码. 本文将作为源码阅读总纲 一.精读部分 java.io java.lang java.util ...

  10. JSP和JavaBean总结

    JSP JSP全名为Java Server Pages,即java服务器页面,其根本是一个简化的Servlet设计.它是在传统的网页HTML文件中插入Java代码,从而形成JSP文件. JSP注释分为 ...