Golang:核心NET/HTTP软件包导入错误



我使用 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工具链运行。

  1. 确保您已经构建了GO工具链,cd ~/godev/src; ./make.bash(./all.bash也可以工作,但是您必须等待测试运行而不是仅仅构建工具链(。
  2. 使用新编译的工具链进行测试,cd ~/godev/src/net/http; ~/godev/bin/go test

我建议在您的个人资料中添加一个别名,例如alias godev=~/godev/bin/go,然后您可以运行godev test

还要确保您不设置GOROOT环境变量,因为它会导致go命令使用指定路径作为Goroot,无论您使用哪种工具链,这不是您想要的。

update

根据评论中的要求,这是我可以提出的简短解释:

  1. 提及"找不到软件包"的错误正在寻找~/godev/src/vendor/golang_net/...中供应的一些软件包。但是,仅当包裹在Gopath或Goroot内部时,供应商支持仅在1.5/1.6中添加。您的Godev安装不在Gopath内部(也不应该是(,Goroot指向您的1.8.1安装。

  2. 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。

最新更新