我基本上试图通过html文件的文件夹。我想将它们嵌入到二进制文件,并能够根据请求解析模板执行的目的。 (请原谅我,如果这不正确的措辞)。
@H_404_8@
我这样做大多数Go的网络应用程序。我使用
go-bindata自动生成Go源代码从所有的文件,我想嵌入,然后将它们编译成二进制。
任何想法,提示,技巧或更好的方式来完成这是非常赞赏。
// 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) } }
所有这些都是在构建过程中自动完成的。
一个缺点是,目前的go build工具不提供一个方法来钩入构建过程,所以我使用一个Makefile为此目的。当调用makefile时,它运行go-bindata来生成所有必需文件的源,然后通常执行一些额外的代码生成位和bobs(值得注意的是,创建一个Go源文件,其中列出了映射中的所有嵌入文件。目录如果你愿意)。然后它继续编译实际的程序。
这可能变得有点凌乱,但你只需要设置一次。
另一个缺点是,使用Makefile意味着软件与go get命令不兼容。但是由于我的大多数网络应用程序并不意味着被共享,这到目前为止还不是一个问题。
当涉及到调试/开发这样的应用程序时,还有另一个问题,从嵌入静态Web内容:我不能只是编辑一个HTML或CSS文件,刷新浏览器看到它的效果。我必须停止服务器,重建它,并重新启动它与每次编辑。这显然不是理想的,所以我把Makefile分成调试和释放模式。释放模式执行我上面描述的。然而,调试模式实际上不会嵌入静态文件。它会为每个文件系统生成源文件,但是它不包含实际的文件数据,而是包含一个只从文件系统加载数据的存根。
就服务器代码而言,生成的代码没有区别。它所做的就是调用一个函数来获取给定静态文件的内容。它不关心内容是实际嵌入二进制,或者如果从外部源加载。因此,这两种构建模式是可以自由互换的。
例如,在发布和调试模式下获取静态文件内容的相同生成函数将如下所示:
发布模式:
func index_html() []byte { return []byte { .... } }
调试模式:
func index_html() []byte { data,err := IoUtil.ReadFile("index.html") ... return data }
两种情况下的接口是相同的。这允许轻松和无忧的开发和调试。