go 新手遇到一个问题,初始化的时候需要加载一个配置文件,这个配置文件在 项目文件夹的 conf 文件下,运行 main.go 是没有问题的,但是如果我执行项目文件夹 task 文件下一个文件的单元测试,就会导致当前成程序的运行路径变为 task, 而 task 和 conf 是平级的当然也就没办法找到配置路径了。
请教各位大佬
1
iappled 2018-03-08 14:19:17 +08:00
获取 绝对路径
|
2
Muninn 2018-03-08 14:45:49 +08:00
你这还是 python 的思路吧
golang 建议开始考虑放弃配置文件 如果是写类似 caddy 这样的本机服务,去学习一下它按照优先级读取本机各路径配置的方法。 但大部分时候都是写 web 服务吧。现在流行用环境变量配置或者用专门的配置管理服务做配置。 都是方便未来集群部署的。 docker 的最佳实践也是用环境变量配置。12factor 也是推荐环境变量的。 |
3
Morriaty 2018-03-08 14:49:16 +08:00
func GetCurrentPath() string {
_, curPath, _, _ := runtime.Caller(0) return curPath } 相当于 python 的__file__ |
5
webluoye 2018-03-08 15:33:22 +08:00
同一楼,也是写绝对路径解决的,获取项目的文件夹名再拼接的。
|
6
madNeal OP @webluoye 你们的意思通过 cur, _ = filepath.Abs('.') 去获取绝对路径 然后再去拼接?
这样执行 main.go 和 执行单元测试的路径是不一样的,就如我上面所说的,执行 mian.go 路径是项目路径,执行单元测试就变成 task 了 |
7
webluoye 2018-03-08 16:23:43 +08:00
os.Getwd() 用这个函数获取当前的路径,判断里面有没有根目录的文件夹名字[缺点 不能有子文件夹和根目录字句一样]
|
9
goofool 2018-03-09 08:52:01 +08:00 via Android
用命令行指定呢,而且测试和线上用一个配置文件不好吧。
|
10
webluoye 2018-03-09 09:30:39 +08:00
同一个目录 ,获取多次是一样的吧,你在什么情况下有遇到获取两次不一样的情况。
|
12
webluoye 2018-03-09 09:48:18 +08:00
这不是根目录和子目录么。。
dirName, _ := os.Getwd() endIndex := strings.Index(dirName, "项目文件夹名") configPath := "" if endIndex > 0 { configPath = dirName[:endIndex] + "项目文件夹名 /" } toml.LoadFile(configPath + "./config.toml") |
14
webluoye 2018-03-09 10:19:35 +08:00
嗯,貌似目前没有一次可以解决问题的方案。
|
15
siguretto 2018-03-13 14:06:47 +08:00
我的做法是从 env 拿配置文件绝对路径,然后各种执行时带上 env 参数
|