V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
madNeal
V2EX  ›  Go 编程语言

go 路径问题

  •  
  •   madNeal ·
    neal1991 · 2018-03-08 13:55:22 +08:00 · 1428 次点击
    这是一个创建于 2451 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    • 不希望在代码里面手写绝对路径
    • 尝试使用 os.Args[0] 以及 os.Executable() 去获取路径,但发觉执行单元测试的时候这个路径也不是项目路径,而是一个 APP/LOCAL 里面的一个路径
    • 最丑陋的方法是判断特定的字符串,然后再处理,但我不想这么做

    请教各位大佬

    15 条回复    2018-03-13 14:06:47 +08:00
    iappled
        1
    iappled  
       2018-03-08 14:19:17 +08:00
    获取 绝对路径
    Muninn
        2
    Muninn  
       2018-03-08 14:45:49 +08:00
    你这还是 python 的思路吧

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

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

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

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

    相当于 python 的__file__
    madNeal
        4
    madNeal  
    OP
       2018-03-08 15:13:50 +08:00
    @Morriaty 这样做应该是获取当前执行这个方法文件的路径 还是要把路径修改一下的
    webluoye
        5
    webluoye  
       2018-03-08 15:33:22 +08:00
    同一楼,也是写绝对路径解决的,获取项目的文件夹名再拼接的。
    madNeal
        6
    madNeal  
    OP
       2018-03-08 15:41:14 +08:00
    @webluoye 你们的意思通过 cur, _ = filepath.Abs('.') 去获取绝对路径 然后再去拼接?
    这样执行 main.go 和 执行单元测试的路径是不一样的,就如我上面所说的,执行 mian.go 路径是项目路径,执行单元测试就变成 task 了
    webluoye
        7
    webluoye  
       2018-03-08 16:23:43 +08:00
    os.Getwd() 用这个函数获取当前的路径,判断里面有没有根目录的文件夹名字[缺点 不能有子文件夹和根目录字句一样]
    madNeal
        8
    madNeal  
    OP
       2018-03-09 08:05:39 +08:00 via Android
    @webluoye 当前路径获取两次可能不一样 我想有没有可能只获取项目的绝对路径
    goofool
        9
    goofool  
       2018-03-09 08:52:01 +08:00 via Android
    用命令行指定呢,而且测试和线上用一个配置文件不好吧。
    webluoye
        10
    webluoye  
       2018-03-09 09:30:39 +08:00
    同一个目录 ,获取多次是一样的吧,你在什么情况下有遇到获取两次不一样的情况。
    madNeal
        11
    madNeal  
    OP
       2018-03-09 09:44:41 +08:00
    @webluoye 上面有说过啊 直接执行根路径下的 main.go 以及 task 文件下一个文件的单元测试
    webluoye
        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")
    madNeal
        13
    madNeal  
    OP
       2018-03-09 09:50:53 +08:00
    @webluoye 是的,我在最开始就说过这个是最后的解决方案。。。。
    webluoye
        14
    webluoye  
       2018-03-09 10:19:35 +08:00
    嗯,貌似目前没有一次可以解决问题的方案。
    siguretto
        15
    siguretto  
       2018-03-13 14:06:47 +08:00
    我的做法是从 env 拿配置文件绝对路径,然后各种执行时带上 env 参数
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2044 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 00:33 · PVG 08:33 · LAX 16:33 · JFK 19:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.