如何在 Go 应用程序中可靠地引用静态文件?
How to reliably refer to static file in a Go application?
我正在编写一个基于模板生成一些文件的 Go 命令行工具。
模板与命令行工具本身的代码一起位于 Git 存储库中。
我想允许以下内容:
- 无论从何处调用二进制文件,都应始终找到模板目录。
- 如果需要,用户可以覆盖模板目录。
因为这是一个 Go 应用程序,所以我使用了类似的东西:
templateRoot := filepath.Join(
os.Getenv("GOPATH"),
"src/github.com/myuser/myproject/templates",
)
但作为 Go 的新手,我想知道这种方法是否可靠:是否保证我的应用程序模板始终可以通过该路径访问?
如果有人将我的应用程序出售到他们自己的项目中怎么办?这对命令行工具有意义吗?
因为 2.,我显然不能't/won 使用 go-bindata 因为我想允许在需要时覆盖模板。
总结:在 Go 命令行工具中可靠地引用非 Go 静态文件的好策略是什么?
GOPATH
用于构建应用程序。虽然您可以在运行时查找 GOPATH
并检查每个 GOPATH
条目的相对位置,但您不能确定它是否存在(当然除非您将其作为 运行 您的先决条件申请)。
go get
本身就是为了方便开发者获取和构建一个go包。它依赖于 GOPATH
(尽管 go1.8 中现在有一个默认值)和 PATH
中的 GOBIN
。许多程序需要简单 go
工具未涵盖的额外步骤,并且有脚本或 Makefile 来进行构建。如果您的目标用户不是开发人员,则无论如何都需要提供一种安装到标准系统路径的方法。
做任何常规程序会做的事情,并使用一些众所周知的路径来定位模板文件。您当然可以在程序中添加一些逻辑来检查位置的层次结构:相对于 $GOPATH
、相对于二进制文件、工作目录、$HOME
等;只需向用户提供您的程序将查找模板的位置列表。
我正在编写一个基于模板生成一些文件的 Go 命令行工具。
模板与命令行工具本身的代码一起位于 Git 存储库中。
我想允许以下内容:
- 无论从何处调用二进制文件,都应始终找到模板目录。
- 如果需要,用户可以覆盖模板目录。
因为这是一个 Go 应用程序,所以我使用了类似的东西:
templateRoot := filepath.Join(
os.Getenv("GOPATH"),
"src/github.com/myuser/myproject/templates",
)
但作为 Go 的新手,我想知道这种方法是否可靠:是否保证我的应用程序模板始终可以通过该路径访问?
如果有人将我的应用程序出售到他们自己的项目中怎么办?这对命令行工具有意义吗?
因为 2.,我显然不能't/won 使用 go-bindata 因为我想允许在需要时覆盖模板。
总结:在 Go 命令行工具中可靠地引用非 Go 静态文件的好策略是什么?
GOPATH
用于构建应用程序。虽然您可以在运行时查找 GOPATH
并检查每个 GOPATH
条目的相对位置,但您不能确定它是否存在(当然除非您将其作为 运行 您的先决条件申请)。
go get
本身就是为了方便开发者获取和构建一个go包。它依赖于 GOPATH
(尽管 go1.8 中现在有一个默认值)和 PATH
中的 GOBIN
。许多程序需要简单 go
工具未涵盖的额外步骤,并且有脚本或 Makefile 来进行构建。如果您的目标用户不是开发人员,则无论如何都需要提供一种安装到标准系统路径的方法。
做任何常规程序会做的事情,并使用一些众所周知的路径来定位模板文件。您当然可以在程序中添加一些逻辑来检查位置的层次结构:相对于 $GOPATH
、相对于二进制文件、工作目录、$HOME
等;只需向用户提供您的程序将查找模板的位置列表。