将模板/HTML文件包含在您的Go二进制文件中

13

我喜欢Go内置的模板库,目前我只是将模板声明为常量字符串。如何处理包含更大更复杂的模板文件?理想情况下,我希望它们在二进制文件中,以简化部署。


3
你的意思是像go-bindata或go.rice这样的吗?(https://dev59.com/Hmcs5IYBdhLWcg3w64Ka) - VonC
1
也许它们看起来像第三方工具。这是否意味着没有标准化的方法?(如果是这种情况,我有点惊讶) - Jay
4个回答

13

自从Go 1.16发布以来,2021年嵌入静态文件变得更加容易。新版本提供了一个新的包embed,其中提供了一组方便的接口和方法,可以将静态文件附加到Go二进制文件中。

go version
# 1.16.x

# then
go doc embed

cks-cli软件中的示例


一些关于嵌入式编程的有用参考和文章: https://pkg.go.dev/embed 和 https://medium.com/@leo_hetsch/using-gos-embed-package-to-build-a-small-webpage-6175953fccea - Z_K

10

历史上在Go语言中没有标准的方法来完成这个。出于历史原因,本答案被保留。请参见下面的更新答案。

--

正如评论所示,有一些库可用于帮助您将二进制数据(如模板、图像等)转换为可以与您自己的源文件一起编译到最终二进制文件中的Go源文件。

虽然这种方法适用于许多项目,但我建议您重新考虑。轻松分发的代价是,在编译主要源代码之前,您必须重新生成创建资产的源文件;当您想要分发以这种方式包含的模板/ JavaScript/ 图像等的小变化时,您将不得不重新编译和重启整个服务器。

在我参与的大多数项目中,前端内容的更改是最频繁的更改类型,这导致我们放弃了这种做法。


1
是的,但我更喜欢只有一个文件需要部署/推送到每个服务器,而且当所有内容都在一个文件中时,回滚到早期版本会更容易。编辑和推送/同步一组模板文件听起来相当不方便。你怎么做到的,可能很麻烦。我认为将所有内容捆绑在一个文件中更容易。 - Jay
@Jacob 我认为你需要修复你的部署流程,而不是你的构建。在服务器上保留最近几个部署,并将其符号链接到当前部署。如果您想回滚,请将符号链接指回即可。非常快速。否则,rsync 将轻松同步大量文件。 - mpen
@mpen 我已经花了多年时间按照你描述的方式进行编程,我的个人经验是,如果你权衡所有的利弊,你的建议更容易出错,原因有很多,这里没有足够的空间列举。我鼓励你尝试分支出去并尝试一下。 - Jay
@mpen 对于1.16版本中的go文件嵌入功能感到兴奋。它似乎足够合法,以至于现在成为了go语言本身的一个特性。如果我能防止更多人在生产服务器上进行HTML的修改和攻击,我会这样做。你有尝试过吗?或者改变了你的想法吗? - Jay
1
@Jay 是的也不是。我现在使用Kubernetes。因此,我的整个应用程序在某种意义上“一个二进制文件”,因为它现在编译成单个映像。确实有好处,即您可以在不翻阅文件的情况下立即扩展和重建服务器。因此,我认为它甚至比Go二进制文件更进一步,因为它包括整个服务器堆栈、配置和所有内容。 - mpen

4

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接