golangembedded文件供以后parsing执行使用

我本质上是试图通过html文件的文件夹。 我想将它们embedded到二进制文件中,并能够根据模板执行的要求parsing它们。 (请原谅,如果我没有正确的措辞)。

任何想法,技巧,窍门或更好的方式来实现这一点非常感谢。

// Template Files type TempFiles struct { Files map[string]string } // Loop through view files and load them func 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) } } 

我用我的大部分Gonetworking应用程序来做这个。 我使用go-bindata从所有想要embedded的文件自动生成Go源代码,然后将它们编译到二进制文件中。 所有这些都是在构build时自动完成的。

一个缺点是当前的构build工具不提供钩入构build过程的方法,所以我使用Makefile来达到这个目的。 当makefile被调用时,它运行go-bindata来为所有必要的文件生成源代码,然后通常会执行一些额外的代码生成位和bobs(特别是创build一个Go源文件,其中列出了地图中的所有embedded文件。目录,如果你会的)。 然后继续编译实际的程序。

这可能会变得有点混乱,但你只需要把它全部设置一次。 另一个缺点是使用Makefile意味着软件与go get命令不兼容。 但是由于我的大多数networking应用程序并不意味着被共享,所以迄今为止这还不是一个问题。

在debugging/开发这样的应用程序时,embedded静态网页内容还有另外一个问题:我不能只编辑HTML或CSS文件并刷新浏览器以查看其效果。 我将不得不停止服务器,重build它,并重新启动它的每一个编辑。 这显然不是很理想,所以我把Makefile分成了一个debugrelease模式。 发布模式就是我上面所描述的。 但是debugging模式实际上并没有embedded静态文件。 它确实生成每个文件的源文件,但是它们不包含实际的文件数据,而是包含一个存根,它只是从文件系统中加载数据。

就服务器代码而言,生成的代码没有区别。 它所做的就是调用一个函数来获取给定静态文件的内容。 它不关心这些内容是否实际embedded到二进制文件中,或者是否从外部来源加载。 所以这两种构build模式是可以自由交换的。

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

发布模式:

 func index_html() []byte { return []byte { .... } } 

debugging模式:

 func index_html() []byte { data, err := ioutil.ReadFile("index.html") ... return data } 

两种情况下的接口都是相同的。 这使得开发和debugging变得简单和轻松。

另一个工具要考虑:另一个最近的好工具来自esc:embedded静态资产在Go ( GitHub回购 )

一个程序:

  • 可以采取一些目录,并以与http.FileSystem兼容的方式recursionembedded其中的所有文件
  • 可以select禁用本地文件系统用于本地开发
  • 在后续运行中不会更改输出文件
  • 文件更改时具有合理大小的差异
  • 是vendoring友好的

友好的供应商意味着当我运行godep或party时,静态embedded文件不会改变。
这意味着它不能有任何第三方import(因为它们的importpath将在import期间被重写,因此与工具本身产生的不同),或所需第三方import的可指定位置。

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

我做了一个包,使debugging和生产之间的切换更容易。 它还提供了一个http.FileSystem实现,使服务器文件变得容易。 它有几种方法将文件添加到二进制文件(生成去代码,或附加为zip)。 https://github.com/GeertJohan/go.rice