【问题标题】:Directory structure for Go web appGo web 应用的目录结构
【发布时间】:2014-11-19 05:42:51
【问题描述】:

我已经按照 Go 网站上的 Writing Web Applications 教程进行操作,并且开始编写自己的网络应用程序。我还阅读了How to Write Go Code 的开头并尝试使用相同的工作区结构来组织我的代码。

我正在编写一个名为 mygosite 的简单网络应用程序,它通过呈现单个模板来处理所有请求。运行go install github.com/wesleym/mygosite 后,我的目录结构现在如下所示:

go
+-src
| +-github.com
|   +-wesleym
|     +-mygosite
|       +-mygosite.go
|       +-templates
|         +- index.html
|       +-.git
+-bin
  +-mygosite

在我的代码中,我指的是路径为templates/index.html 的模板。当我运行bin/mygosite 时,应用程序找不到我的模板,因为它在源代码树中。由于模板对我的应用很重要,因此我不想将它们移出我的 mygosite git 存储库。

考虑到我正在尝试做的事情,我的目录布局是否合理?我是否应该将代码中模板的路径更改为src/github.com/wesleym/mygosite/templates/index.html?像 CSS 和 JavaScript 这样的静态资产呢?到了引入它们的时候,它们应该放在哪里?

tl;dr:在 Go Web 应用程序项目中,我应该将模板和静态文件放在哪里?

【问题讨论】:

标签: templates web-applications go directory-structure


【解决方案1】:

2021 年更新,使用 Go 1.16,您将使用:

新的embed package 使用新的//go:embed 指令在编译期间提供对嵌入程序中的文件的访问。

参见“Embedding files in Go using the "embed" package”,来自Amit Saha(@Atlassian 的 SRE),他确实在他的项目中嵌入了一个模板。

//go:embed templates/main.go.tmpl
var tmplMainGo []byte

这使得上述模板的内容可以作为tmplMainGo 变量中的字节切片使用。

然后我们可以按如下方式访问模板:

tmpl, err := tmpl.Parse(string(tmplMainGo))

amitsaha/go-embed查看演示。

另见Barak Amar中的“Working with Embed in Go 1.16 Version”和他自己的demo project


原回答2014:可以考虑使用项目jteeuwen/go-bindata(2018年存档)

此包将任何文件转换为可管理的 Go 源代码。用于将二进制数据嵌入到 go 程序中。文件数据在转换为原始字节切片之前可选地进行 gzip 压缩。

你可以看到它在“golang embed file for later parsing execution use”中使用

同一页面还提到 GeertJohan/go.rice 作为替代

另一个最近的好工具来自esc: Embedding Static Assets in Go

一个程序:

  • 可以获取一些目录并以与 http.FileSystem 兼容的方式将所有文件递归地嵌入其中
  • 可以选择禁用以与本地文件系统一起使用以进行本地开发
  • 不会在后续运行中更改输出文件
  • 文件更改时有合理大小的差异
  • 对供应商友好

【讨论】:

  • 请注意jteeuwen/go-bindata 存储库已被所有者归档。最后一次提交是在 2018 年 3 月 4 日。
  • @MatthewRankin 谢谢。我已经更新了使用 Go 1.16 新嵌入功能而不是旧项目的答案。
【解决方案2】:

在 Go Web 应用程序项目中,我应该将模板和静态文件放在哪里?

是“错误”的问题。如果您问“我的可执行文件将如何找到它的资源?”您几乎找到了解决方案:您的可执行文件应该从一个(或多个)可配置的位置读取其资源(并且提供合理的默认值总是很好)。当前工作目录中的命令行标志、环境变量和配置文件对于此类任务很常见。 (当然,如果您只有少量资源:按照 VonC 的建议将它们打包到可执行文件中;一旦您开始包含图像或视频等大型资源,此方案就会失效。)

【讨论】:

    【解决方案3】:

    如果您想要模板嵌套(有点像模板继承),请尝试:go(golang) template manager, especially for web development

    建议模板布局可以是:

    templates/
    ├── context
    │   ├── layout
    │   │   └── layout.tpl.html
    │   └── partial
    │       └── ads.tpl.html
    └── main
        └── demo
            ├── demo1.tpl.html
            ├── demo2.tpl.html
            └── dir1
                └── dir2
                    └── any.tpl.html
    

    demo1

    demo2

    any

    【讨论】:

      猜你喜欢
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 2017-06-03
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 2012-03-23
      相关资源
      最近更新 更多