如何可靠地让项目扎根于 go?

Sil*_*orm 6 testing go

现在我runtime.Caller(0)结合使用path.Dirfilepath.Abs来获取当前执行文件的路径并获取相对于它的项目根目录。

所以假设我有一个这样的文件夹结构:

$GOPATH/src/example.org/myproject
$GOPATH/src/example.org/myproject/main.go
$GOPATH/src/example.org/myproject/path
$GOPATH/src/example.org/myproject/path/loader.go
Run Code Online (Sandbox Code Playgroud)

如果我想要我的项目根目录,我调用 loader.go ,它依次获取其路径,runtime.Caller(0)然后上升一个文件夹以到达项目根目录。

问题是当使用go test -cover执行的文件不再在其正常位置时,而是在用于测试和覆盖率分析的特殊子目录中。
runtime.Caller(0)给我以下内容:

example.org/myproject/path/_test/_obj_/loader.go
Run Code Online (Sandbox Code Playgroud)

运行它path.Dirfilepath.Abs会给我:

$GOPATH/src/example.org/myproject/path/example.org/myproject/path/_test/_obj_
Run Code Online (Sandbox Code Playgroud)

当我从那里上去时,我不会到达项目根目录,但显然完全不同。所以我的问题
是:有没有可靠的方法来获得项目根?

Ric*_*kyA 3

您可以从环境变量构建它$GOPATH

gp := os.Getenv("GOPATH")
ap := path.Join(gp, "src/example.org/myproject")
fmt.Println(ap)
Run Code Online (Sandbox Code Playgroud)

这将产生您的项目目录的绝对路径:

/path/to/gopath/src/example.org/myproject

GOPATH这显然只有在设置时才有效。又名。在你的开发机器上。在生产中,您需要通过配置文件提供目录。

  • 嗯,在生产环境中只有二进制文件。无论如何,你的项目根目录不会在那里,除非你故意把它放在那里,在这种情况下你事先知道它在哪里。 (3认同)
  • 这不是一个坏习惯,但如果这就是您正在做的事情,您应该提供一个配置设置来提供这些文件的路径。在生产中不会有“项目根”。 (3认同)
  • 这不会给生产带来问题吗?我不知道用户可能会将二进制文件放在哪里。所以路径需要有一定的相对性。 (2认同)