我使用Go为各种平台编译一个程序,并通过调用相对路径或仅通过其名称(如果它在PATH变量中)来运行它.
是否有可能找出可执行文件的位置?
说,我的程序叫做" foo(.exe)".我可以运行./foo,foo(如果它在PATH) ../../subdir/subdir/foo.
我试过使用os.Args[0],我想我应该检查程序名称是否包含除"foo"之外的其他内容.如果是,则使用filepath.Abs,如果不是,则使用(我找不到函数名称,有一个函数可以通过PATH查看程序的位置).
现在我runtime.Caller(0)结合使用path.Dir和filepath.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.Dir,filepath.Abs会给我:
$GOPATH/src/example.org/myproject/path/example.org/myproject/path/_test/_obj_
Run Code Online (Sandbox Code Playgroud)
当我从那里上去时,我不会到达项目根目录,但显然完全不同。所以我的问题
是:有没有可靠的方法来获得项目根?
我是 GO 和 mac 的新手,我正在尝试使用 sysctl 来查找正在运行的进程的完整路径名。
kprocs, err := unix.SysctlKinfoProcSlice("kern.proc.all")
if err != nil {
fmt.Println("error: ", err)
}
for _, proc := range kprocs {
name := string(proc.Proc.P_comm[:])
pid := proc.Proc.P_pid
extName, err := unix.SysctlKinfoProc("kern.proc.pathname", int(pid))
if err != nil {
fmt.Println("error: ", err)
}
Run Code Online (Sandbox Code Playgroud)
并收到错误:没有这样的文件或目录
我正确使用这个功能吗?
编辑
如果我像这样运行进程: ./processName ,那么我没有得到它的完整路径,例如 /Users/username/go/src/processName - 这就是我需要的。所有的解决方案ps都会给出相对路径,而我需要一些给出过程的绝对路径的东西。
来自测试文档:
“该包构建在临时目录中,因此不会干扰非测试安装。”
因此,任何使用与可执行文件相关的目录的代码都不会相对于 Temp\go-build......
换句话说,考虑到以下情况:
.\helloplanet.go
.\行星\planetary.res
.\helloplanet_test.go
go test
Run Code Online (Sandbox Code Playgroud)
在 Temp\go-build... 中生成一个 exe 文件,但它不会在那里重新创建一个planets\ 子目录,因此 helloplanet.exe 中寻找planets\planetary.res 的任何代码当然不会找到它。
应该如何处理这个问题呢?
我怎么能写一个像'cd'那样的Go程序呢?
我试过运行一个命令,但它没有用.
func main() {
cmd := exec.Command("cd", "/media/")
err := cmd.Run()
log.Printf("Command finished with error: %v", err)
}
Run Code Online (Sandbox Code Playgroud)