golang:核心网/ http包导入错误

时间:2017-04-30 01:39:11

标签: http go compilation

我已使用git clone https://go.googlesource.com/gogo source code克隆到我的~/godev/目录中(在文档建议的GOPATH之外)。

我的$ GOPATH是~/gocode

我使用官方的osx安装程序安装了1.8.1。

如果我进入~/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 后跟cp -R /usr/local/go/src/vendor/golang_org .按照说明here后,我仍然会收到以下错误:

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下没有代理软件包,但我仍然不知道如何解决这个问题以及其他2个错误。

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测试而不会出现这些错误?

1 个答案:

答案 0 :(得分:4)

这里的问题是你正在运行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运行测试。
  3. 我建议为您的个人资料添加别名,例如alias godev=~/godev/bin/go,然后您就可以运行godev test

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

    <强>更新

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

    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,如果导入包不与内部目录共享公共根目录,则无法导入内部包。

    3. 归结为指向1.8.1安装的GOROOT。您可能想知道是否可以将GOROOT设置为指向您的godev目录,但这也无法正常工作。我并不确定这里的机制,但我认为问题归结为1.8.1编译器期望的内容与~/godev/src/runtime中的内容不匹配。

      编译工具链时,编译GOROOT的位置,因此当~/godev/bin/go运行时,它使用~/godev作为GOROOT。