如果GOPATH不设置,go程序编译是不可能的。但是许多go项目是使用 Makefile 构建的,因为go还缺少提取git修订、设置版本等的功能。因此应该可以自动从 Makefile 检测 GOPATH。
假设我手动设置了我的 GOPATH 一次go get -d:
go get -d github.com/zyedidia/micro/cmd/micro
现在,如果我打开另一个会话,cd进入github.com/zyedidia/micro/cmd/micro并执行make build,构建将失败:
...
cmd/micro/micro.go:20:2: cannot find package "layeh.com/gopher-luar" in any of:
    /usr/lib/go-1.7/src/layeh.com/gopher-luar (from $GOROOT)
    ($GOPATH not set)
Makefile:15: recipe for target 'build' failed
make: *** [build] Error 1
那么,如果GOPATH没有设置,我该如何设置它Makefile并确保此时有go环境?
这不起作用:
GOPATH ?= ../../../..
更新:以下代码有效,但未检测到父目录包含src,bin和pkgdirs。
export GOPATH ?= $(abspath $(dir ../../../../..))
export需要变换make变量到环境变量,?=将make只有它的变量没有设置,abspath并dir描述如下:
小智 9
我遇到了同样的问题,这是我的解决方案:
ifndef $(GOPATH)
    GOPATH=$(shell go env GOPATH)
    export GOPATH
endif