我使用 git clone https://go.googlesource.com/go
克隆了go源代码,将我的 ~/godev/
目录(如文档所建议的,在gopath之外(。
我的$ gopath是 ~/gocode
我使用官方OSX安装程序安装了1.8.1。
如果我将CD到~/godev/go/src/net/http
并运行go test
,我会得到以下错误:
h2_bundle.go:46:2: cannot find package "golang_org/x/net/http2/hpack" in any of:
/usr/local/go/src/golang_org/x/net/http2/hpack (from $GOROOT)
~/gocode/src/golang_org/x/net/http2/hpack (from $GOPATH)
h2_bundle.go:47:2: cannot find package "golang_org/x/net/idna" in any of:
/usr/local/go/src/golang_org/x/net/idna (from $GOROOT)
~/gocode/src/golang_org/x/net/idna (from $GOPATH)
h2_bundle.go:48:2: cannot find package "golang_org/x/net/lex/httplex" in any of:
/usr/local/go/src/golang_org/x/net/lex/httplex (from $GOROOT)
~/gocode/src/golang_org/x/net/lex/httplex (from $GOPATH)
transport.go:32:2: cannot find package "golang_org/x/net/proxy" in any of:
/usr/local/go/src/golang_org/x/net/proxy (from $GOROOT)
~/gocode/src/golang_org/x/net/proxy (from $GOPATH)
transfer.go:14:2: use of internal package not allowed
在我按照cd $GOPATH/src
进行CC_6的指示之后,我仍然会遇到这些错误:
h2_bundle.go:47:2: code in directory ~/gocode/src/golang_org/x/net/idna expects import "golang.org/x/net/idna"
transport.go:32:2: cannot find package "golang_org/x/net/proxy" in any of:
/usr/local/go/src/golang_org/x/net/proxy (from $GOROOT)
~/gocode/src/golang_org/x/net/proxy (from $GOPATH)
transfer.go:14:2: use of internal package not allowed
的确,在〜/gocode/src/golang_org/x/net下没有代理包,但是我仍然不知道该如何解决该问题。
GOARCH="amd64"
GOBIN=""
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="~/gocode"
GORACE=""
GOROOT="/usr/local/go"
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/71/k_tftg2d1qd7gf5ww0n_wl_r0000gn/T/go-build541211050=/tmp/go-build -gno-record-gcc-switches -fno-common"
CXX="clang++"
CGO_ENABLED="1"
PKG_CONFIG="pkg-config"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
如果我运行all.Bash脚本,它将运行所有单元测试,但这很耗时。有没有办法仅运行NET/HTTP测试而不会获得这些错误?
这里的问题是您正在运行go test
,其中go
命令是您的1.8.1安装。为了使测试正常工作,您应该使用开发目录构建的GO工具链运行。
- 确保您已经构建了GO工具链,
cd ~/godev/src; ./make.bash
(./all.bash
也可以工作,但是您必须等待测试运行而不是仅仅构建工具链(。 - 使用新编译的工具链进行测试,
cd ~/godev/src/net/http; ~/godev/bin/go test
。
我建议在您的个人资料中添加一个别名,例如alias godev=~/godev/bin/go
,然后您可以运行godev test
。
还要确保您不设置GOROOT
环境变量,因为它会导致go
命令使用指定路径作为Goroot,无论您使用哪种工具链,这不是您想要的。
update
根据评论中的要求,这是我可以提出的简短解释:
-
提及"找不到软件包"的错误正在寻找
~/godev/src/vendor/golang_net/...
中供应的一些软件包。但是,仅当包裹在Gopath或Goroot内部时,供应商支持仅在1.5/1.6中添加。您的Godev安装不在Gopath内部(也不应该是(,Goroot指向您的1.8.1安装。 -
transfer.go:14:2: use of internal package not allowed
是因为transfer.go
导入net/http/internal
。由于这不是相对路径,它将在$GOROOT/src/net/http/internal
中找到,而不是~/godev/src/net/http/internal
,并且如果导入软件包不与内部目录共享共同的根,则无法导入内部软件包。
它归结为指向您的1.8.1安装的Goroot。您可能想知道是否可以将Goroot设置为您的Godev目录,但这也无法正常工作。我在这里的机制不太确定,但我认为问题归结为1.8.1编译器期望的是~/godev/src/runtime
中的不匹配。
编译工具链时,将Goroot的位置编译到其中,因此当运行~/godev/bin/go
时,它将使用~/godev
作为Goroot。