我运行以下代码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中吗?
答案 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项目的主路径