File 在Golang的不同测试中加载数据文件

File 在Golang的不同测试中加载数据文件,file,go,path,absolute-path,File,Go,Path,Absolute Path,我的目录结构如下: ./gen/items/items.go ./gen/items/items_test.go ./gen/items/data/items.xml ./engine/action/actions_test.go 在items.go中,我有一个应该运行一次的方法,用从items.xml加载的项填充一些数据结构。我使用一个绝对路径来实现这一点,当代码在items\u test.go中运行时,该路径有效,因为我假设go test中的当前工作目录是当前测试包的包根目录 itemsX

我的目录结构如下:

./gen/items/items.go
./gen/items/items_test.go
./gen/items/data/items.xml
./engine/action/actions_test.go
items.go
中,我有一个应该运行一次的方法,用从
items.xml
加载的项填充一些数据结构。我使用一个绝对路径来实现这一点,当代码在
items\u test.go
中运行时,该路径有效,因为我假设go test中的当前工作目录是当前测试包的包根目录

itemsXMLPath:=“/data/items.xml”
absPath,err:=path.Abs(itemsXMLPath)
如果出错!=零{
...
}
字节,err:=ioutil.ReadFile(absPath)
您可以在这里看到为什么绝对路径
/data/items.xml
可以从
gen/items
目录中正常工作

如果我在
actions\u tests.go
中运行测试,它会尝试使用
action
中的相对路径,但失败,因为
action
中没有
数据
目录

items.go中调用loadFromXML方法时,我希望它始终使用
items
目录中的相对路径,该目录将搜索下面的数据目录。

我假设由于调用代码位于items.go
中,因此路径将从此处开始,但它似乎使用测试运行程序或go运行程序的工作目录(如果我运行main.go)

是否有办法确保无论是在测试运行中使用,还是在主运行中使用,xml加载函数都使用repo中一致目录的相对路径(例如,当从主运行还是从测试运行时,如何一致地查找包根目录)


我相信有一种方法可以实现这一点,而无需复制测试数据,也无需传递loadFromXML函数的相对路径,该函数必须根据调用方法的位置进行调整

我刚刚编写了一个函数,可以从项目中任何正在运行的文件夹中找到根目录,然后从那里应用相对路径。似乎是从main或test runner运行的

func getRootPath() string {
    dir, err := os.Getwd()
    if err != nil {
        log.Fatal(err)
    }

    // Check if already in root directory (e.g. main.go)
    lastSlashIndex := strings.LastIndex(dir, "/")
    cName := dir[lastSlashIndex+1:]
    if cName == "#root-folder-name#" {
        return dir
    }

    // Get parent directory
    parent := filepath.Dir(dir)
    lastSlashIndex = strings.LastIndex(parent, "/")
    pName := parent[lastSlashIndex+1:]

    // If not at root, continue getting parent
    for pName != "#root-folder-name#" {
        parent = filepath.Dir(parent)
        lastSlashIndex = strings.LastIndex(parent, "/")
        pName = parent[lastSlashIndex+1:]
    }
    return parent
}
然后我可以将这个目录与相对路径连接起来,并在
filepath.Abs中使用它

itemsXMLPath := getRootPath() + "/folder/path/data/items.xml"
absPath, err := filepath.Abs(itemsXMLPath)

最后,我编写了一个函数,可以从项目中任何正在运行的文件夹中找到根目录,然后从那里应用相对路径。似乎是从main或test runner运行的

func getRootPath() string {
    dir, err := os.Getwd()
    if err != nil {
        log.Fatal(err)
    }

    // Check if already in root directory (e.g. main.go)
    lastSlashIndex := strings.LastIndex(dir, "/")
    cName := dir[lastSlashIndex+1:]
    if cName == "#root-folder-name#" {
        return dir
    }

    // Get parent directory
    parent := filepath.Dir(dir)
    lastSlashIndex = strings.LastIndex(parent, "/")
    pName := parent[lastSlashIndex+1:]

    // If not at root, continue getting parent
    for pName != "#root-folder-name#" {
        parent = filepath.Dir(parent)
        lastSlashIndex = strings.LastIndex(parent, "/")
        pName = parent[lastSlashIndex+1:]
    }
    return parent
}
然后我可以将这个目录与相对路径连接起来,并在
filepath.Abs中使用它

itemsXMLPath := getRootPath() + "/folder/path/data/items.xml"
absPath, err := filepath.Abs(itemsXMLPath)

不,这是不可能的。将文件名作为参数传递。您也可以使用实际的绝对路径(以斜杠开始,而不是以点开始),但如果您想在另一台机器上运行此代码,这显然不是非常实用的。包只是构建程序的工具,而不是在运行程序时。这些XML文件是静态的吗?如果是,请使用类似或否的方式,没有办法做到这一点。将文件名作为参数传递。您也可以使用实际的绝对路径(以斜杠开始,而不是以点开始),但如果您想在另一台机器上运行此代码,这显然不是非常实用的。包只是构建程序的工具,而不是在运行程序时。这些XML文件是静态的吗?如果是,请使用类似或的方式,工作目录与源位置无关。这仅在您实际从源代码树中执行代码时有效工作目录与源位置无关。这仅在您实际从源代码树中执行代码时有效