go 路径问题

2018-03-08 13:55:22 +08:00
 madNeal

go 新手遇到一个问题,初始化的时候需要加载一个配置文件,这个配置文件在 项目文件夹的 conf 文件下,运行 main.go 是没有问题的,但是如果我执行项目文件夹 task 文件下一个文件的单元测试,就会导致当前成程序的运行路径变为 task, 而 task 和 conf 是平级的当然也就没办法找到配置路径了。

请教各位大佬

1344 次点击
所在节点    Go 编程语言
15 条回复
iappled
2018-03-08 14:19:17 +08:00
获取 绝对路径
Muninn
2018-03-08 14:45:49 +08:00
你这还是 python 的思路吧

golang 建议开始考虑放弃配置文件

如果是写类似 caddy 这样的本机服务,去学习一下它按照优先级读取本机各路径配置的方法。

但大部分时候都是写 web 服务吧。现在流行用环境变量配置或者用专门的配置管理服务做配置。
都是方便未来集群部署的。

docker 的最佳实践也是用环境变量配置。12factor 也是推荐环境变量的。
Morriaty
2018-03-08 14:49:16 +08:00
func GetCurrentPath() string {
_, curPath, _, _ := runtime.Caller(0)
return curPath
}

相当于 python 的__file__
madNeal
2018-03-08 15:13:50 +08:00
@Morriaty 这样做应该是获取当前执行这个方法文件的路径 还是要把路径修改一下的
webluoye
2018-03-08 15:33:22 +08:00
同一楼,也是写绝对路径解决的,获取项目的文件夹名再拼接的。
madNeal
2018-03-08 15:41:14 +08:00
@webluoye 你们的意思通过 cur, _ = filepath.Abs('.') 去获取绝对路径 然后再去拼接?
这样执行 main.go 和 执行单元测试的路径是不一样的,就如我上面所说的,执行 mian.go 路径是项目路径,执行单元测试就变成 task 了
webluoye
2018-03-08 16:23:43 +08:00
os.Getwd() 用这个函数获取当前的路径,判断里面有没有根目录的文件夹名字[缺点 不能有子文件夹和根目录字句一样]
madNeal
2018-03-09 08:05:39 +08:00
@webluoye 当前路径获取两次可能不一样 我想有没有可能只获取项目的绝对路径
goofool
2018-03-09 08:52:01 +08:00
用命令行指定呢,而且测试和线上用一个配置文件不好吧。
webluoye
2018-03-09 09:30:39 +08:00
同一个目录 ,获取多次是一样的吧,你在什么情况下有遇到获取两次不一样的情况。
madNeal
2018-03-09 09:44:41 +08:00
@webluoye 上面有说过啊 直接执行根路径下的 main.go 以及 task 文件下一个文件的单元测试
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")
madNeal
2018-03-09 09:50:53 +08:00
@webluoye 是的,我在最开始就说过这个是最后的解决方案。。。。
webluoye
2018-03-09 10:19:35 +08:00
嗯,貌似目前没有一次可以解决问题的方案。
siguretto
2018-03-13 14:06:47 +08:00
我的做法是从 env 拿配置文件绝对路径,然后各种执行时带上 env 参数

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/436136

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX