如何在Go应用程序中可靠地引用静态文件?

时间:2017-03-21 12:35:50

标签: go static-files

我正在编写一个Go命令行工具,可以根据模板生成一些文件。

模板位于Git存储库中,旁边是命令行工具本身的代码。

我想允许以下内容:

  1. 二进制文件,无论从哪里调用,都应该始终找到模板目录。
  2. 如果需要,用户可以覆盖模板目录。
  3. 由于这是一个Go应用程序,我选择了类似的东西:

    templateRoot := filepath.Join(
        os.Getenv("GOPATH"),
        "src/github.com/myuser/myproject/templates",
    )
    

    但对Go来说还是个新手,我想知道这种方法是否足够强可靠<保证我的应用程序模板是否始终可以在该路径上访问?

    如果有人将我的应用程序供应到他们自己的项目中会怎样?这对命令行工具有意义吗?

    由于2.,我显然无法使用go-bindata因为我想允许在需要时覆盖模板。

    总结:在Go命令行工具中可靠地引用非go,静态文件的好策略是什么?

1 个答案:

答案 0 :(得分:1)

GOPATH用于构建应用程序。虽然您可以在运行时查找GOPATH并检查每个GOPATH条目的相对位置,但您无法确定它是否存在(当然,除非您将其作为运行应用程序的先决条件)。 / p>

go get本身便于开发人员获取和构建go包。它依赖于GOPATH(虽然现在在go1.8中有默认值)和GOBIN中的PATH。许多程序需要简单go工具未涵盖的额外步骤,并且需要脚本或Makefile来进行构建。如果您的目标用户不是开发人员,则无论如何都需要提供一种安装到标准系统路径的方法。

执行常规程序的操作,并使用一些众所周知的路径来查找模板文件。您当然可以在程序中添加一些逻辑来检查位置的层次结构:相对于$GOPATH,相对于二进制,工作目录,$HOME等;只需向用户提供程序将查找模板的位置列表。