golang 中使用 statik 将静态资源编译进二进制文件中

现在的很多程序都会提供一个 Dashboard 类似的页面用于查看程序状态并进行一些管理的功能,通常都不会很复杂,但是其中用到的图片和网页的一些静态资源,如果需要用户额外存放在一个目录,也不是很方便,如果能打包进程序发布的二进制文件中,用户下载以后可以直接使用,就方便很多。

最近在阅读 InfluxDB 的源码,发现里面提供了一个 admin 管理的页面,可以通过浏览器来执行一些命令以及查看程序运行的信息。但是我运行的时候只运行了一个 influxd 的二进制文件,并没有看到 css, html 等文件。

原来 InfluxDB 中使用了 statik 这个工具将静态资源都编译进了二进制文件中,这样用户只需要运行这个程序即可,而不需要管静态资源文件存放的位置。

go get -d github.com/rakyll/statik
go install github.com/rakyll/statik

首先要声明,一般在 main.go 文件中,这样直观一些:

package main//go:generate statik -src=../../web/public -dest=../../internal -ffunc main() {}

这段声明的意思是,使用 statik 命令将目录../../web/public下的文件和目录编译到一个go文件中,此文件为../../internal/statik/statik.go,会自动创建之。

go:generate指令需要手动执行,来到根目录下go generate ./…

statik.go文件内容为

// Code generated by statik. DO NOT EDIT.package statikimport ("github.com/rakyll/statik/fs"
)func init() {data := ".............."fs.Register(data)
}

将文件信息注册到 fs 之后,就可以实例化出来一个 http.FileSystem 对象

var statikFS http.FileSystemstatikFS, err = fs.New()

然后就可以指定文件名来读取文件内容了

file, err := statikFS.Open("/index.html")

这里返回的 file 类型是http.File,它服务于文件系统 FileSystem ,因此它是只读的,没有提供写的接口。

// A File is returned by a FileSystem's Open method and can be
// served by the FileServer implementation.
//
// The methods should behave the same as those on an *os.File.
type File interface {io.Closerio.Readerio.SeekerReaddir(count int) ([]fs.FileInfo, error)Stat() (fs.FileInfo, error)
}

在vue项目中,我们只需要返回 index.html 的内容即可,具体实现如下

m.Get("/", func(ctx *macaron.Context) {file, err := statikFS.Open("/index.html")if err != nil {logger.Error("读取首页文件失败: %s", err)ctx.WriteHeader(http.StatusInternalServerError)return}io.Copy(ctx.Resp, file)})

当然 public 目录中的应该是打包好的 vue 项目。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/243691.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐IDEA一个小插件,实用性很高!!

插件: Convert YAML and Properties File 由于每个人的开发习惯不同,在开发过程中会遇到各种小细节的问题。今天给大家介绍一个小插件,作用不大,细节很足。 就是properties类型文件和yml文件互相自由转换 解决:…

数据结构课程设计 仓储管理系统

仓储管理系统 【基本功能】 把货品信息表抽象成一个线性表,货品信息(包括ID、货品名、定价、数量等)作为线性表的一个元素,实现:按ID、货品名分别查找某货品信息(包括ID、货品名、定价、数量等&#xff0…

前台vue配置

前台 vue环境 1.傻瓜式安装node: 官网下载:https://nodejs.org/zh-cn/2.安装cnpm: >: npm install -g cnpm --registryhttps://registry.npm.taobao.org3.安装vue最新脚手架: >: cnpm install -g vue/cli注:如果2、3步报错,清除缓…

FastReport动态绑定数据源

先新建数据源 然后选择新建连接csv 选择好后,下一步完成,拖到自己想要的位置即可 程序里对应上相应的名称就行了 // 创建报表 Report report new Report(); report.Load(frxPath); DataTable dataTable1 new DataTable("MyDataTable");…

如何攻克钙钛矿太阳能电池电性能测试技术壁垒?

1 前言 “碳达峰、碳中和”背景下,发展新能源成为降低碳排放的第一驱动力。以太阳能为代表的清洁能源在市场上的占比大幅提升,与之对应的太阳能电池同样发展迅速。太阳能电池是一种吸收光能产生电能的半导体光电二极管,硅基电池作为第一代太…

beego API 自动化文档

API 全局设置 必须设置在 routers/router.go 中,文件的注释,最顶部: // APIVersion 1.0.0 // Title mobile API // Description mobile has every tool to get any job done, so codename for the new mobile APIs. // Contact astaxiegmai…

解决Windows下VSCode控制台乱码问题

我们在Windows使用VSCode编写C/C程序时,如果代码中的中文字符串使用的是UTF8编码,且代码内没有设置控制台的输出编码,或者编译时没有指定运行时编码(GCC可以在编译时使用-fexec-charsetGBK来指定运行时的字符串编码;cl…

本地读取Excel文件并进行数据压缩传递到服务器

在项目开发过程中,读取excel文件,可能存在几百或几百万条数据内容,那么对于大型文件来说,我们应该如何思考对于大型文件的读取操作以及性能的注意事项。 类库:Papa Parse - Powerful CSV Parser for JavaScript 第一步…

计算机网络学习first day

In the first day.  首先,我们要先有清晰地学习思路,然后介绍计算机网络的发展及在信息时代的各类应用及带来的一些负面问题。然后是对因特网进行概述,包括网络,互联网和因特网的相关概念,因特网发展的三个历史阶段&a…

16位单片机单片机S1C17153

16位单片机单片机 .16KB ROM / 2KB内存 * S1C17653对于程序开发很有用。 .产生具有内置振荡器的操作时钟。 - OSC3B振荡器电路:2MHz/1MHz/500kHz(类型)内部振荡器电路 -OSC1无振荡器电路:32.768 kHz(类型&#xf…

对MODNet 主干网络 MobileNetV2的剪枝探索

目录 1 引言 1.1 MODNet 原理 1.2 MODNet 模型分析 2 MobileNetV2 剪枝 2.1 剪枝过程 2.2 剪枝结果 2.2.1 网络结构 2.2.2 推理时延 2.3 实验结论 3 模型嵌入 3.1 模型保存与加载 法一:保存整个模型 法二:仅保存模型的参数 小试牛刀 小结…

Unity工程没有创建.sln文件,导致打开C#文件无法打开解决方案

最近又开始折腾些Unity的小项目,重新遇到一些常见的小问题 点击报错文件 却没有打开文件 于是查看了下打开Window->Package Manager 选择Unity Registry 搜索Visual Studio Editor,发现并没有安装 同理,也可以安装VSCode的插件 问题解决了…

R语言rvest爬虫如何设置ip代理?

前言 在R语言中使用rvest进行网络爬虫时,可以使用代理服务器来隐藏真实IP地址。有一些R包可以帮助爬虫中设置代理,其中一个常用的包是httr。以下是一个简单的例子,演示如何在rvest中设置IP代理 教程 一、获取代理IP并提取 二、详情设置 l…

开发实践8_REST

一、Django REST Framework, Django View & APIView MTV模式实现前后端分离。Representational State Transfer 表现层状态转化。Representation 资源(Resource a specific info. on net.)具体呈现形式。ST 修改服务端的数据。修改数据 POST请求。…

C#,入门教程(07)——软件项目的源文件与目录结构

上一篇: C#,入门教程(06)——解决方案资源管理器,代码文件与文件夹的管理工具https://blog.csdn.net/beijinghorn/article/details/124895033 创建新的 C# 项目后, Visual Studio 会自动创建一系列的目录与文件。 程序员后面的工…

SERVLET API

SERVLET API Servlet API是用于创建servlet的java类和接口的集合。这些类和接口存放在javax.servlet和javax.servlet.http包中。 javax.servlet包 javax.servlet包的类和接口用于servlet和客户机之间的通信。创建servlet时,需要直接或通过扩展实现Servlet接口的类来实现Serv…

从传统管理到数字化转型——易点易动固定资产管理系统的应用

在数字化时代,企业管理正迎来一场革命性的转变。固定资产管理作为企业管理的重要组成部分,也需要适应数字化转型的潮流。易点易动固定资产管理系统作为一项先进的数字化工具,为企业提供了高效、便捷的资产管理解决方案。本文将介绍易点易动固…

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络

VMware workstation平台下配置Fedora-Server-39-1.5虚拟机网络 Fedora包含的软件以自由及开放源码许可来发布,并旨在成为该技术领域的领先者。Fedora在专注创新、抢先集成新技术、与上游Linux社区紧密工作方面拥有良好名声。该文档适用于在VMware workstation平台下…

【爬虫、数据可视化实战】以“人口”话题为例爬取实时微博数据并进行舆情分析

前言: 近期在weibo上讨论的比较热的话题无非就是“人口”了。TaoTao也看了一些大家发的内容。但是感觉单纯的看文字内容不能很直观的反应出来大家的关切。索性就使用爬虫对数据进行爬取,同时结合着数据可视化的方式让数据自己开口说话。那么接下来就让我…

单片机中MCU跑RTOS相比裸机的优势

经常有读者问关于RTOS的问题,比如:我现在要不要学习RTOS? 学习RTOS有什么好处? 我的项目要不要跑RTOS? 问这些问题,其实归根结底还是对RTOS理解的不够,项目开发的经验还不足等。针对这部分朋友…