17

我需要参考patients.jsonpatients.go这里是文件夹结构:

在此处输入图像描述

如果我做:

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

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

如果我做:

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

正好相反(狂欢很好,但测试失败)。

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

4

3 回答 3

10

相对路径总是被解释/解析为基本路径:当前工作目录 - 因此它总是有其局限性。

如果您可以始终照顾正确的工作目录,则可以继续使用相对路径。

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

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

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

获得基本路径后,您可以通过连接基本路径和相对路径来获得完整路径。您可以使用path.Join()or 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"
于 2015-06-25T19:27:15.987 回答
2

我自己从未使用过 Revel,但以下内容对我很有帮助:

http://revel.github.io/docs/godoc/revel.html

  • revel.BasePath
  • revel.AppPath
于 2015-06-25T19:28:26.670 回答
0

这不是路径的问题,而是您的设计的问题。

你应该更加小心地设计你的代码。

据我所知,您在测试文件中共享相同的路径并显示运行。我想也许你json在你的模型包中硬编码你的路径,这是不建议的。

更好的方法是

  • 模型包从全局配置中获取 json 路径,或者使用 json 路径初始化模型,如model := NewModel(config_path). 所以揭示运行可以用你想要的任何 json 初始化模型。
  • ../../conf/patients.json您的 xxxx_testing.go 中的硬代码“ ”
于 2019-01-16T09:58:25.567 回答