为了账号安全,请及时绑定邮箱和手机立即绑定

如何嵌入文件以供以后解析执行使用

如何嵌入文件以供以后解析执行使用

Go
翻翻过去那场雪 2021-05-12 14:09:33
我实质上是试图浏览html文件的文件夹。我想将它们嵌入到二进制文件中,并能够根据请求解析它们以用于模板执行目的。(如果我的措辞不正确,请原谅)。任何想法,技巧,窍门或实现此目的的更好方法将不胜感激。// Template Filestype TempFiles struct {    Files map[string]string}// Loop through view files and load themfunc LoadTempFiles() {    t := new(TempFiles)    // Load template files    filepath.Walk("application/views", func(path string, info os.FileInfo, err error) error {    if !info.IsDir() {        content, _ := ioutil.ReadFile(path)        t.Files[path] = string(content)    }    return nil    })}func ViewTemp(w http.ResponseWriter, path string) {    t := new(TempFiles)    temp, err := template.New().Parse(t.Files[path])    if err != nil {        http.Error(w, err.Error(), http.StatusInternalServerError)    } else {        temp.Execute(w, nil)    }}
查看完整描述

3 回答

?
HUWWW

TA贡献1874条经验 获得超12个赞

我使用大多数Go Web应用程序执行此操作。我使用go-bindata从要嵌入的所有文件中自动生成Go源代码,然后将其编译为二进制文件。所有这些都是在构建过程中自动完成的。


缺点是当前的go构建工具没有提供一种连接构建过程的方法,因此我为此使用了一个Makefile。调用makefile时,它将运行go-bindata以生成所有必需文件的源,然后通常执行一些其他代码生成位和鲍勃(特别是,创建Go源文件,该源文件列出了映射中的所有嵌入式文件。)如果可以的话)。然后继续编译实际程序。


这可能会有些混乱,但是您只需将其设置一次即可。另一个缺点是,使用Makefile意味着该软件与go get命令不兼容。但是由于我的大多数Web应用程序都不是要共享的,因此到目前为止,这还不是问题。


当涉及到调试/开发这样的应用程序时,嵌入静态Web内容会引起另一个问题:我不能只是编辑HTML或CSS文件并刷新浏览器以查看其效果。我将不得不停止服务器,重建它,并在每次编辑时重新启动它。这显然是不理想的,因此我将Makefile拆分为debugandrelease模式。释放模式执行我上面描述的操作。但是,调试模式实际上不会嵌入静态文件。它确实为每个文件生成源文件,但是它不是包含实际文件数据,而是包含存根,该存根仅从文件系统中加载数据。


就服务器代码而言,生成的代码没有区别。它所做的只是调用一个函数来获取给定静态文件的内容。不管该内容是否实际嵌入到二进制文件中,还是从外部源加载的内容,都无关紧要。因此,这两种构建模式可以自由互换。


例如,在释放和调试模式下获取静态文件内容的相同生成函数将如下所示:


释放模式:


func index_html() []byte {

    return []byte {

        ....

    }

}

调试模式:


func index_html() []byte {

   data, err := ioutil.ReadFile("index.html")

   ...

   return data

}

两种情况下的界面都是相同的。这样可以轻松,轻松地进行开发和调试。


查看完整回答
反对 回复 2021-05-17
?
精慕HU

TA贡献1845条经验 获得超8个赞

需要考虑的另一个工具:esc是另一个最新的好工具:在Go中嵌入静态资产GitHub repo

一个程序,该程序:

  • 可以获取一些目录,并以与http.FileSystem兼容的方式将所有文件递归地嵌入其中

  • 可以选择禁用与本地文件系统一起用于本地开发

  • 在后续运行中将不会更改输出文件

  • 文件更改时具有合理大小的差异

  • 对供应商友好

供应商友好意味着当我跑步godep或聚会时,静态嵌入文件不会更改。
这意味着它不能有任何第三方导入(因为它们的导入路径将在期间重写goimports,因此与工具本身生成的内容不同),也不能具有所需的第三方导入的指定位置。

它会生成很好的gzip压缩字符串,每个文件一个。
有一个简单的标志来启用本地开发模式,该标志足够聪明,不会从文件名中剥离目录前缀(esc有时需要一个选项)。
输出包括所有需要的代码,并且不依赖于任何第三方库来与兼容http.FileSystem


查看完整回答
反对 回复 2021-05-17
  • 3 回答
  • 0 关注
  • 206 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信