Go 程序结构如下:-
├── app.go
├── bin
│ └── run.go
├── config
│ └── Config.go
└── package1
├── package1_file.go
└── tmpl
└── template.tmpl
现在,在 package1_file.go
中,我已经通过如下相对路径访问了 template.tmpl:
t, err := template.ParseFiles("./tmpl/template.tmpl")
当我运行测试时,测试能够成功运行,因为我的猜测是,Go 在运行包测试时更改了当前工作目录。 go tests -v ./...
但是,当我从根文件夹运行 (go build -o app && ./app)
程序时,我收到错误消息,提示该文件不存在。
Error compiling template: open ./tmpl/template.tmpl: no such file or directory
当我将路径更改为 package2/tmpl/template.tmpl
时,它开始工作。
package2
之外的代码与此模板文件无关,因此我不想在公开 package2
时将其作为参数公开给函数。我有哪些选择?
定位这些支持文件的正确方法是什么?
最佳答案
您在这里的一些错误假设下进行操作 - 主要是项目源代码或目录结构在运行时以任何方式相关。他们不是。
一个 Go 程序编译成一个二进制文件,可以在任何地方执行,没有源代码,没有安装 Go - 只是二进制文件。您需要考虑任何时候您的项目中有您在运行时需要的任何类型的文件:
- 您需要决定这些文件的位置:
- 您可以指定一个路径,可以是执行时相对于 CWD 的路径,也可以是绝对路径(但您不应该这样做)
- 您可以通过 CLI、环境变量、配置文件等将路径作为运行时参数接受。
- 您可以使用许多可用的软件包之一将它们嵌入到二进制文件本身(说真的 - 太多了,以至于 Google 搜索
go embed static files
不仅出现了几个库,而且还有几篇文章比较各种图书馆)
- 您需要决定如何打包整个东西:
- 你可以压缩/tar/二进制文件旁边的任何资源
- 您可以将所有资源和二进制文件压缩/压缩/压缩
- 如上所述,您可以将它们作为单个文件嵌入到二进制文件中
关于如何处理此问题,您必须做出一些选择,但关键要点是不要假设源代码中的路径在运行时完全相关 .至少参数化资源的根路径,以便您的代码可以在任何地方运行,然后您的测试可以传入适当的路径以用于测试。
关于go - 如何处理 Go 包中支持文件的路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57212214/