【发布时间】:2020-02-16 03:10:58
【问题描述】:
我的目录结构如下:
./gen/items/items.go
./gen/items/items_test.go
./gen/items/data/items.xml
./engine/action/actions_test.go
在items.go 中,我有一个方法应该运行一次,并使用从items.xml 加载的项目填充一些数据结构。我使用绝对路径执行此操作,当代码在 items_test.go 中运行时,该路径有效,因为我假设 go test 中的当前工作目录是当前测试包的包根目录。
itemsXMLPath := "./data/items.xml"
absPath, err := path.Abs(itemsXMLPath)
if err != nil {
...
}
bytes, err := ioutil.ReadFile(absPath)
您可以在这里看到为什么绝对路径 ./data/items.xml 在 gen/items 目录中可以正常工作。
如果我在actions_tests.go 中运行测试,它会尝试使用来自action 的相对路径并失败,因为action 中没有data 目录。
当我在 items.go 中调用 loadFromXML 方法时,我希望它始终使用来自 items 目录的相对路径,这将搜索下面的数据目录。
我假设由于调用代码在items.go 中,路径将从那里开始,但它似乎使用了测试运行器或 go 运行器的工作目录(如果我运行 main.go)。
有没有办法确保无论是在测试运行中使用,还是在主运行中使用,xml 加载函数都使用来自 repo 中一致目录的相对路径(例如,我如何在运行时始终找到包根目录来自 MAIN 或测试)。
我确信有一种方法可以在不复制测试数据或不传递 loadFromXML 函数的相对路径的情况下实现这一点,必须根据调用方法的位置进行调整!
【问题讨论】:
-
不,没有办法做到这一点。将文件名作为参数传递。您也可以使用实际的绝对路径(以斜线开头,而不是点开头),但如果您想在另一台机器上运行此代码,这显然不太实用。
-
解释一下:运行时没有包,所以运行时没有“包根”之类的东西。包只是用于构建程序的东西,而不是在运行它时。
-
那些 XML 文件是静态的吗?如果是,请使用 github.com/GeertJohan/go.rice 或 github.com/gobuffalo/packr
标签: file go path absolute-path