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