gpt4 book ai didi

go - 无法在我的程序和单元测试中使用相同的相对路径

转载 作者:IT王子 更新时间:2023-10-29 01:06:28 28 4
gpt4 key购买 nike

在我的 Go 项目中,我使用了一个打开特定文件并返回其内容的函数。该文件存储在另一个目录中,但仍在我的项目目录中。

package infrastructure

func openKey() ([]byte, error) {
if path, err := filepath.Abs("../security/key.rsa"); err != nil {
return nil, err
}

return ioutil.ReadFile(path)
}

如果我从单元测试中调用此函数,它就会起作用。但是如果我在我的程序中调用相同的函数,我会出现这个错误:

2015/08/13 15:47:54 open /me/go/src/github.com/myaccount/security/key.rsa: no such file or directory

正确的文件绝对路径是:

/me/go/src/github.com/myaccount/myrepo/security/key.rsa

使用 openKey 函数的代码(来 self 的程序和单元测试)都在同一个包中:infrastructure

这是我执行程序的方式:

go install && ../../../../bin/myproject

以及我如何执行单元测试:

go test ./...

最后是我项目的目录结构:

go/src/github.com/myaccount/myrepo/: 
- main.go
- security:
- key.rsa // The file that I want to open
- ...
- infrastructure
- openFile.go // The file with the func `openKey``
- server.go // The file with the func that call the func `openKey`
- openFile_test.go // The unit test that calls the func `openKey`

编辑:

这是我的程序二进制文件所在位置的绝对路径:

/Users/me/Documents/Développement/Jean/go/bin

以及我的单元测试所在的位置:

/var/folders/tj/8ywtc7pj3rs_j0y6zzldwh5h0000gn/T/go-build221890578/github.com/myaccount/myrepo/infrastructure/_test

有什么建议吗?
谢谢!

最佳答案

首先,在运行测试时不应使用与在生产环境中运行应用程序时相同的文件。因为每个有权访问存储库的人都可以访问测试文件,这是一个安全问题。

如评论中所述,问题是在运行测试时,工作目录是这些源代码(实际上,在运行测试之前将所有源代码复制到临时目录),而当您真正运行程序,工作目录是您从中运行命令的目录,因此相对路径错误。

我的建议是使用配置选项来获取加载文件的文件(或用于路径的基本目录)。使用环境变量(我强烈建议您这样做,有关详细信息,请参阅 12factors manofesto)、配置文件、命令行标志等。

关于go - 无法在我的程序和单元测试中使用相同的相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31990342/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com