embed 小技巧-动态文件更新 - V2EX
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 年 2 月 22 日 2434 次点击
    这是一个创建于 1793 天前的主题,其中的信息可能已经有所发展或是发生改变。

    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 年 2 月 23 日 via iPhone
    tairan2006
        2
    tairan2006  
       2021 年 2 月 23 日
    我还在等 brew 发 1.16 呢……
    zhs227
        3
    zhs227  
       2021 年 2 月 23 日
    @tairan2006 可以使用 gvm,已经用上 1.6 了。
    zhs227
        4
    zhs227  
       2021 年 2 月 23 日
    typo: 1.6 -> 1.16
    tairan2006
        5
    tairan2006  
       2021 年 2 月 23 日
    @zhs227 懒得搞,golang 兼容性还行,一直用最新版…java 和 node 倒是用了版本管理
    kuoruan
        6
    kuoruan  
       2021 年 2 月 23 日
    @tairan2006 哈哈,我也在等,天天在看状态
    https://github.com/Homebrew/homebrew-core/pull/71289

    最后一个前置修改刚刚已经 merge 了,现在正在跑 Test,应该马上就会合并了
    mauve
        7
    mauve  
    PRO
       2021 年 2 月 23 日
    nice idea, 顺便问一下楼主那边,后端 host 一个静态文件服务器的应用场景是什么样的?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     3504 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 10:41 PVG 18:41 LAX 02:41 JFK 05:41
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86