如何获取项目的根路径

时间:2017-11-28 12:33:37

标签: go path

我运行以下代码workingDir, _ := os.Getwd()server.go文件中的根项目下并获取根路径, 现在我需要将server.go文件移动到以下结构

myapp
  src
   server.go

我希望找到go/src/myapp的路径 目前,我移动了server.go myapp->src>server.go go/src/myapp/src/server.go后,我获得了../的路径,我希望获得预览路径,

我应该如何自动进行?或者我应该将List明确地放在get path中吗?

2 个答案:

答案 0 :(得分:8)

os.Getwd()不会返回您的源文件路径。它返回程序当前工作目录(通常是您执行程序的目录)。

示例:

假设我在/Users/Arman/go/src/github.com/rmaan/project/main.go中有一个main.go,只输出os.Getwd()

$ cd /Users/Arman/go/src/github.com/rmaan/project/
$ go run main.go
/Users/Arman/go/src/github.com/rmaan/project <nil>

如果我切换到其他目录并在那里执行,结果将会改变。

$ cd /Users/Arman/
$ go run ./go/src/github.com/rmaan/project/main.go
/Users/Arman <nil>

IMO你应该明确地将你想要的路径传递给你的程序,而不是试图从上下文推断它(因为它可能在生产环境中特别改变)。以下是flag包的示例。

package main

import (
    "fmt"
    "flag"
)


func main() {
    var myPath string
    flag.StringVar(&myPath, "my-path", "/", "Provide project path as an absolute path")
    flag.Parse()

    fmt.Printf("provided path was %s\n", myPath)
}

然后按如下方式执行您的程序:

$ cd /Users/Arman/go/src/github.com/rmaan/project/
$ go run main.go  --my-path /Users/Arman/go/src/github.com/rmaan/project/
provided path was /Users/Arman/go/src/github.com/rmaan/project/
$ # or more easily
$ go run main.go  --my-path `pwd`
provided path was /Users/Arman/go/src/github.com/rmaan/project/

答案 1 :(得分:1)

如果您的项目是git存储库,则还可以将git rev-parse命令与--show-toplevel一起使用:

cmdOut, err := exec.Command("git", "rev-parse", "--show-toplevel").Output()
if err != nil {
    assert.Fail(t, fmt.Sprintf(`Error on getting the go-kit base path: %s - %s`, err.Error(), string(cmdOut)))
    return
}

fmt.Println(strings.TrimSpace(string(cmdOut)))

无论您在子路径中的任何位置,它都会打印出git项目的主路径