为什么runtime.Caller(0)返回构建二进制文件的路径?

lns*_*shi 1 go

正如问题标题所示,runtime.Caller(0)返回的路径实际上是二进制文件的构建位置(我的构建环境中的路径),而不是当前二进制文件所在的路径。

这对我来说有点难以理解,构建时信息是如何注入并带入运行时的?

我有一些这样的代码:

_, f, _, _ := runtime.Caller(0)
cfg.ProjRootPath = filepath.Join(filepath.Dir(f), "../..")
Run Code Online (Sandbox Code Playgroud)

然后我的管道(构建环境)构建二进制文件,然后我将二进制文件带到其他测试环境,并给cfg.ProjRootPath我一些仅存在于我的构建环境中的路径,例如: ,/j/prod-build7899/src/....这正是项目源代码所在的位置在构建管道上。

bla*_*een 5

runtime.Caller(0)返回有关调用堆栈的信息信息,而不是工作目录。文件名和行号当然是指用于编译可执行文件的源代码。

此外,底层实现是特定于平台的。

如果您想要工作目录(绝对路径),请使用os.Executable

可执行文件返回启动当前进程的可执行文件的路径名。

^ 来自文档: https: //golang.org/pkg/os/#Executable