如何从代码和测试中引用相关文件

Pab*_*dez 11 relative-path go revel

我需要引用patients.jsonpatients.go,这里的文件夹结构:

在此输入图像描述

如果我做:

filepath.Abs("../../conf/patients.json")

它适用go test ./...但却失败了revel run

如果我做:

filepath.Abs("conf/patients.json")

恰恰相反(狂欢很好,但测试失败).

有没有办法正确引用该文件,以便它适用于测试和正常程序运行?

icz*_*cza 8

始终将相对路径解释/解析为基本路径:当前工作目录 - 因此它始终具有其局限性.

如果您可以继续使用正确的工作目录,则可以继续使用相对路径.

我建议不要依赖工作目录,而是明确指定基本路径.这可能在您的应用程序中有一个硬编码的默认值(也可能是工作目录),您应该提供几种方法来覆盖它的值.

推荐的方法来覆盖解析"相对"路径的基本路径:

  1. 命令行标志(见flag包)
  2. 环境变量(见os.Getenv())
  3. (已命名修复)用户主目录中的配置文件(请参阅os/user/Useros/user/Current())

获得基本路径后,可以通过连接基本路径和相对路径来获取完整路径.您可以使用path.Join()filepath.Join(),例如:

// Get base path, from any or from the combination of the above mentioned solutions
base := "/var/myapp"

// Relative path, resource to read/write from:
relf := "conf/patients.json"

// Full path that identifies the resource:
full := filepath.Join(base, relf) // full will be "/var/myapp/conf/patients.json"
Run Code Online (Sandbox Code Playgroud)

  • @PabloFernandez如果它被编译成可执行的二进制文件,甚至没有`.go`文件...... (2认同)
  • 我还提到了另一种可能性:1)有一个全局变量定义资产的基目录前缀,比如,`main.AssetsDir`; 2)允许下游包装器在构建时使用链接器覆盖字符串类型值的能力覆盖它,例如:`go build -ldflags =" - X main.AssetsDir =/usr/share/cool_app/assets"`.通过研究"go help build"和"go tool link -h"的输出,OP可以获得更多的背景知识. (2认同)