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分成了一个debug
和release
模式。 发布模式就是我上面所描述的。 但是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