Golang Gin embed 静态文件嵌入

  • 需求
  • 改进思路
    • a). Gin文档 静态资源嵌入 方案
    • b). Gin 自带方法
      • 代码
      • 效果
    • c). 改进
      • 1. 自带http库做法
      • 2. 查看gin staticfs源码
      • 3. 最终解决方案

需求

Gin开发Web服务时, 编译生成的应用可能如下, 需提供static目录和web-app.exe给用户
如果将static文件夹到生成的exe中,分发单个EXE文件给用户使用,更加方便

# 改进前
├── static
│   └── js/jquery.min.js
│   ├── favicon.ico
│   ├── index.html
├── web-app.exe
# 改进后
├── web-app.exe (static内嵌进exe里)

改进思路

a). Gin文档 静态资源嵌入 方案

参考: https://learnku.com/docs/gin-gonic/1.7/examples-bind-single-binary-with-template/11403
需要使用额外工具go-assets,操作有点复杂,因此不考虑

b). Gin 自带方法

代码

package main
import ("embed""net/http""github.com/gin-gonic/gin"
)
//go:embed static/*
var fs embed.FS
func main() {r := gin.Default()r.StaticFS("/static", http.FS(fs))
}

效果

favicon.ico为例, 需要访问
http://localhost/static/static/favicon.ico
中间多了两个static, 而index.html中可能资源位置是
<link rel="icon" href="/static/favicon.ico">

c). 改进

1. 自带http库做法

http.StripPrefix("/static", http.FileServer(http.FS(fs)))

2. 查看gin staticfs源码

看下大致调用函数名,可以看到大概是这样调用
http.FileServer(fs).ServeHTTP(c.Writer, c.Request)

func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileSystem) HandlerFunc {absolutePath := group.calculateAbsolutePath(relativePath)fileServer := http.StripPrefix(absolutePath, http.FileServer(fs))return func(c *Context) {........ 读取fs中文件,判断是否存在有权限等错误,省略fileServer.ServeHTTP(c.Writer, c.Request)}
}

3. 最终解决方案

package main
import ("embed""net/http""github.com/gin-gonic/gin"
)
//go:embed static/*
var fs embed.FS
func main() {r := gin.Default()
/*
查看staticfs方案中gin启动日志可以看到,staticfs实际注册了GET、HEAD
[GIN-debug] GET    /static/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
[GIN-debug] HEAD   /static/*filepath         --> github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1 (3 handlers)
因此直接用r.Any
*/r.Any("/static/*filepath", func(c *gin.Context) {staticServer := http.FileServer(http.FS(fs))staticServer.ServeHTTP(c.Writer, c.Request)})r.Run("localhost:80")
}

查看效果达到预期

Golang Gin embed static 静态文件嵌入相关推荐

  1. gin embed打包静态资源文件

    问题 在gin项目中如果单纯的只是实现api接口,那打包出来的是一个可执行文件.但如果项目中如果包含一些页面,则必定会引入一些css,jss,html文件.这样会使打包出来后会挂着对应的静态资源文件夹 ...

  2. django创建项目,创建app以及调用templates(模版)和static(静态文件)的方法

    # django创建项目,创建app以及调用templates和static的方法 创建项目project 检查django的版本.我用的是2.2.1版本 打开终端,输入命令: python -m d ...

  3. gin框架35--静态文件服务

    gin框架35--静态文件服务 介绍 案例 说明 介绍 本文介绍了如何使用gin框架实现静态文件服务,并加以案例说明. 案例 源码: package mainimport ("github. ...

  4. Django的静态文件的配置

    静态文件配置 STATIC_URL = '/static/' # 静态文件配置 STATICFILES_DIRS = [os.path.join(BASE_DIR,'static') ] # 暴露给外 ...

  5. 用Express、MySQL搭建项目(接口以及静态文件获取、文件上传等)

    一.简介 本文将主要基于node.js使用express框架搭建一个后台环境,包括如何自定义项目目录.所用依赖以及中间件.路由以及模板引擎.接口数据获取以及文件上传等内容. 二.后台环境搭建 1.新建 ...

  6. 模板变量,过滤器和静态文件引用

    模板变量,过滤器和静态文件引用 模板路径 Djiango先到settings里面找templates下的DIRS查看是否有路径,也是从上往下依次寻找,找到就返回. 如果DIRS没有,就到APP_DIR ...

  7. 在laravel5.8中集成swoole组件----用协程实现的服务端和客户端(二)---静态文件如何部署...

    目前,较为成熟的技术是采用laravelS组件,注意和laravel 区别laravelS多了一个大写的S,由于laravelS默认监听5200端口,所以laravel项目要做一些调整 例如: 静态文 ...

  8. django 中静态文件项目加载问题

    问题描述: django项目中创建了多个app后,每个app中都有对应的static静态文件.整个项目运行时这些静态文件的加载就是一个问题,因为整个项目我只参与了一部分,项目部署之类的并没有参与.我写 ...

  9. python-django_自定义标签和过滤器_模板的导入与继承_静态文件使用方式_inclusion_tag的用法

    django 1. 自定义标签和过滤器 1. 自定义过滤器 -第一步:在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag-第二步:在 ...

最新文章

  1. python 12 socket 编程
  2. 数据库系统概念总结:第八章 关系数据库设计
  3. 用AsyncCtp实现一个简单的EchoServer
  4. java.net.UnknownServiceException: CLEARTEXT communication to wanandroid.com not permitted by network
  5. python模块之hashlib
  6. 操纵浏览器历史记录 : popstate() 、 history.pushState() 、 window.history.pushState()
  7. 程序员经典面试题,高并发系统,一般需要怎么做
  8. pip常用命令、配置pip源
  9. 1.Windows下 PHP 开源框架 laravel 的搭建
  10. 算法竞赛入门经典(第二版) —— 第一章 程序设计入门
  11. 中国分省、分城市地形起伏度数据
  12. 估值指标一把手——市盈率
  13. 宝宝起名取名字:渊博雅正、令人难忘的男宝宝名字
  14. 2个鸡蛋100层楼--动态规划
  15. 数据库(Mysql)的四种隔离级别
  16. 服务器系统重启和断电重启,服务器设置断电重启吗
  17. 数学建模系列-预测模型(六)---微分方程模型
  18. 据说看完这21个故事的人,30岁前都成了亿万富翁
  19. python pip安装包时出现 ValueError: check_hostname requires server_hostname 错误 解决方法
  20. 计算机等设备管理制度,计算机设备管理制度范本..doc

热门文章

  1. kafka-02-kafka设计原理详解
  2. 资源 :数据科学类国家精品在线开放课程
  3. 传统经典CV算法_高斯核函数介绍
  4. CSS实现手机信号条
  5. WeakMap弱引用
  6. php 常见算法合集
  7. php简洁版雪花算法Snowflake
  8. 清华开源virtual—box5.1下载
  9. 【翻译】如何做一个项目经理?
  10. 合同矩阵判断方法及性质