V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
eudore
V2EX  ›  Go 编程语言

embed 小技巧-动态文件更新

  •  
  •   eudore · 2021-02-22 22:27:07 +08:00 · 1724 次点击
    这是一个创建于 1129 天前的主题,其中的信息可能已经有所发展或是发生改变。

    go1.16 embed 可以将文件嵌入到编译后的二进制中,以后发布一个 web 程序可以只提供一个二进制程序,不需要其他文件,同时避免重复文件 io 读取。

    但是在开发时,使用 embed 后如果修改前端文件那么需要重启 GO 程序,重新生成 embed 数据,导致开发过程不方便。

    提供一个 embed 支持动态文件的小技巧,使用 http.Dir 和 embed.FS 混合组合一个新的 http.FileSystem,如果当前目录存在静态文件,那么使用 http.Dir 返回静态文件内容,否则使用 embed.FS 编译的内容,这样既可以使用 http.Dir 访问时时的静态文件,可以使发布的二进制程序使用 embed.FS 编译内置的静态文件数据。

    package main
    
    import (
    	"embed"
    	"net/http"
    )
    
    //go:embed static
    var f embed.FS
    
    func main() {
    	http.ListenAndServe(":8088", http.FileServer(FileSystems{
    		http.Dir("."),
    		http.FS(f),
    	}))
    }
    
    // 组合多个 http.FileSystem
    type FileSystems []http.FileSystem
    
    func (fs FileSystems) Open(name string) (file http.File, err error) {
    	for _, i := range fs {
            // 依次打开多个 http.FileSystem 返回一个成功打开的数据。
    		file, err = i.Open(name)
    		if err == nil {
    			return
    		}
    	}
    	return
    }
    

    在代码目录创建一个 static 目录,然后里面创建一个 index.html auth.html,启动程序后就可以使用 http://localhost:8088/static/index.html 访问到静态文件,在修改文件后不重启也会显示最新的文件内容。

    7 条回复    2021-02-23 14:15:38 +08:00
    freestyle
        1
    freestyle  
       2021-02-23 09:12:23 +08:00 via iPhone
    tairan2006
        2
    tairan2006  
       2021-02-23 09:33:53 +08:00
    我还在等 brew 发 1.16 呢……
    zhs227
        3
    zhs227  
       2021-02-23 09:41:25 +08:00
    @tairan2006 可以使用 gvm,已经用上 1.6 了。
    zhs227
        4
    zhs227  
       2021-02-23 09:41:51 +08:00
    typo: 1.6 -> 1.16
    tairan2006
        5
    tairan2006  
       2021-02-23 10:57:12 +08:00
    @zhs227 懒得搞,golang 兼容性还行,一直用最新版…java 和 node 倒是用了版本管理
    kuoruan
        6
    kuoruan  
       2021-02-23 10:58:44 +08:00
    @tairan2006 哈哈,我也在等,天天在看状态
    https://github.com/Homebrew/homebrew-core/pull/71289

    最后一个前置修改刚刚已经 merge 了,现在正在跑 Test,应该马上就会合并了
    mauve
        7
    mauve  
       2021-02-23 14:15:38 +08:00
    nice idea, 顺便问一下楼主那边,后端 host 一个静态文件服务器的应用场景是什么样的?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3738 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 10:38 · PVG 18:38 · LAX 03:38 · JFK 06:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.