Golang安装遇到问题求帮助

Golang安装遇到问题求帮助 大家好,我遇到了关于 go getgo install 的问题。我已经尝试了从谷歌上能找到的所有解决方案,但觉得自己无法独立解决,所以想寻求大家的帮助。

背景信息

我想安装一个包 github.com/ramya-rao-a/go-outline

sudo go get -v -u github.com/ramya-rao-a/go-outline
github.com/ramya-rao-a/go-outline (download)
Fetching https://golang.org/x/tools/go/buildutil?go-get=1
https fetch failed: Get https://golang.org/x/tools/go/buildutil?go-get=1: dial tcp 216.239.37.1:443: i/o timeout
package golang.org/x/tools/go/buildutil: unrecognized import path "golang.org/x/tools/go/buildutil" (https fetch: Get https://golang.org/x/tools/go/buildutil?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

我认为是中国的防火墙导致了超时问题,即使我已经设置了 ALL_PROXYhttp_proxyhttps_proxy。所以我放弃了,尝试通过离线源代码安装。

主要问题

我从 github 克隆了仓库:

git clone https://github.com/ramya-rao-a/go-outline $GOPATH/src/github.com/ramya-rao-a/go-outline
Cloning into '/Users/jtr109/gopath/src/github.com/ramya-rao-a/go-outline'...
remote: Counting objects: 35, done.
remote: Total 35 (delta 0), reused 0 (delta 0), pack-reused 35
Unpacking objects: 100% (35/35), done.

然后尝试使用 go install 命令安装:

go install github.com/ramya-rao-a/go-outline
go/src/github.com/ramya-rao-a/go-outline/main.go:14:2: cannot find package "golang.org/x/tools/go/buildutil" in any of:
        /usr/local/go/src/golang.org/x/tools/go/buildutil (from $GOROOT)
        /Users/jtr109/go/src/golang.org/x/tools/go/buildutil (from $GOPATH)

我觉得这很奇怪,因为第二个路径不是我的路径。以下是我通过 go env 生成的 go 环境:

go env
GOARCH="amd64"
GOBIN="/usr/local/go/bin"
GOCACHE="/Users/jtr109/Library/Caches/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/jtr109/gopath"
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/qg/x7lv7ghs3qv1c85vkgyqgqy40000gn/T/go-build555607611=/tmp/go-build -gno-record-gcc-switches -fno-common"

那么,是什么导致查找 golang.org/x/tools/go/buildutil 的第二个路径不是 $GOPATH//src/golang.org/x/tools/go/buildutil,而是意外的路径 /Users/jtr109/go/src/golang.org/x/tools/go/buildutil (from $GOPATH)

我的设置有什么问题吗?

补充信息

Go 版本

go version
go version go1.10.3 darwin/amd64

我的 bashrc

export GOROOT=/usr/local/go
export GOPATH=$HOME/gopath
export PATH=$PATH:$GOPATH/bin:$GOROOT/bin

我 GOPATH 中的 buildutil

tree $GOPATH/src/golang.org/x/tools/go/buildutil
/Users/jtr109/gopath/src/golang.org/x/tools/go/buildutil
├── allpackages.go
├── allpackages_test.go
├── fakecontext.go
├── overlay.go
├── overlay_test.go
├── tags.go
├── tags_test.go
├── util.go
├── util_test.go
└── util_windows_test.go

0 directories, 10 files

希望能得到大家的慷慨帮助,非常感谢。


更多关于Golang安装遇到问题求帮助的实战教程也可以访问 https://www.itying.com/category-94-b0.html

8 回复

不太确定是什么导致了你的超时问题。但我认为你的GOBIN设置不正确。我认为应该是:

GOBIN=$GOPATH/bin

例如,以下是我的GOPATH和GOBIN:

GOBIN="/home/andrew/go-workspace/bin"

GOPATH="/home/andrew/go-workspace"

参考:https://golang.org/cmd/go/#hdr-GOPATH_environment_variable

更多关于Golang安装遇到问题求帮助的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的,我认为您说得对。

可能当我使用 go install 安装 go-outline 时,Golang 在我的路径中搜索依赖项 buildutil,但在错误的路径中找不到它。在我卸载所有与 Golang 相关的内容并重新安装,确保配置正确后,Golang 就能从我的路径 $GOPATH/src/golang.org/x/tools/go/buildutil 中找到依赖项 buildutil,一切运行正常。

也感谢您关于 go install 的提示!

你可能会再次遇到超时错误,但请尝试使用 go get -u 获取依赖项 golang.org/x/tools/go/buildutil。如果成功,再安装 go-outline 包。如果出现超时错误,说明有东西阻止你访问该包。可以尝试从 golang.org 获取其他包,看看是否只影响 buildutil。不过,你的 GOBIN 现在没问题了。

func main() {
    fmt.Println("hello world")
}

非常感谢Andrew!

我无法找到正确GOPATH的问题似乎已经解决了!我按照文档说明卸载了GO并删除了相关文件:

如果您是通过Mac OS X安装包安装的Go,那么您应该移除/etc/paths.d/go文件。

然后我通过.pkg重新安装,并确保正确设置了GOROOTGOPATHGOBIN

现在,一切运行正常!

go get获取go-outline包时的超时问题可能仍然存在。但我已经解决了必须解决的问题!

感谢您的帮助!

参考:https://golang.org/cmd/go/#hdr-Compile_and_install_packages_and_dependencies

需要说明的是,go install 不会下载您尝试安装的软件包的依赖项。因此,由于您在本地克隆了 github.com/ramya-rao-a/go-outline 并运行 go install,依赖项 golang.org/x/tools/go/buildutil 未被获取,这就是您收到以下错误的原因:

cannot find package "golang.org/x/tools/go/buildutil" in any of:

go install 有一个 -i 标志可以安装依赖项,但根据文档,我认为它不会下载您尝试安装的软件包的依赖项。

然而,您当前的主要问题似乎是由于某种原因无法访问 golang.org/x/tools/go/buildutil 包,这就是当您运行 go get -v -u github.com/ramya-rao-a/go-outline 时(请记住 go get 也会获取软件包的依赖项)出现超时错误的原因。

我还发现了另一个奇怪的现象:

我尝试测试构建包时,发现它能找到正确的 GOPATH

$ go build -v -o ./try-buildutil gihub.com/ramya-rao-a/go-outline
can't load package: package gihub.com/ramya-rao-a/go-outline: cannot find package "gihub.com/ramya-rao-a/go-outline" in any of:
        /usr/local/go/src/gihub.com/ramya-rao-a/go-outline (from $GOROOT)
        /Users/jtr109/gopath/src/gihub.com/ramya-rao-a/go-outline (from $GOPATH)

但是当我尝试安装这个包时,如果该包导入了 buildutil,它又会陷入混乱:

➜  gopl sudo go install github.com/ramya-rao-a/go-outline
Password:
../../../go/src/github.com/ramya-rao-a/go-outline/main.go:14:2: cannot find package "golang.org/x/tools/go/buildutil" in any of:
        /usr/local/go/src/golang.org/x/tools/go/buildutil (from $GOROOT)
        /Users/jtr109/go/src/golang.org/x/tools/go/buildutil (from $GOPATH)

感谢您的帮助。

我推断超时问题可以理解为网络问题。而go get命令只是克隆仓库并自动执行go install。因此我暂时倾向于通过使用go install来实现我的目标。

github.com/ramya-rao-a/go-outlinemain.go只是简单地通过导入来获取builduitl。所以我仍然认为go install的错误是我的问题。

我也尝试了对该仓库使用go get,但可能效果不佳:

$ go get -v -u github.com/ramya-rao-a/go-outline
github.com/ramya-rao-a/go-outline (download)
Fetching https://golang.org/x/tools/go/buildutil?go-get=1
https fetch failed: Get https://golang.org/x/tools/go/buildutil?go-get=1: dial tcp 216.239.37.1:443: i/o timeout
package golang.org/x/tools/go/buildutil: unrecognized import path "golang.org/x/tools/go/buildutil" (https fetch: Get https://golang.org/x/tools/go/buildutil?go-get=1: dial tcp 216.239.37.1:443: i/o timeout)

那么我还能尝试什么方法来解决我的go install路径错误?或者可能是我对它有所误解?

你遇到的问题是由于 go-outline 依赖 golang.org/x/tools 包,而 Go 工具链在查找依赖时没有正确识别你的 GOPATH 设置。从错误信息可以看到,Go 工具在查找 golang.org/x/tools/go/buildutil 时搜索了错误的路径 /Users/jtr109/go/src/,而不是你设置的 /Users/jtr109/gopath/src/

这通常是因为存在多个 GOPATH 或者 Go 模块缓存的问题。以下是解决方案:

解决方案

1. 清理并重新设置环境

首先清理 Go 的模块缓存和构建缓存:

go clean -modcache
go clean -cache

2. 使用 GOPROXY 设置(推荐)

设置 Go 代理来绕过网络问题:

export GOPROXY=https://goproxy.cn,direct
export GO111MODULE=auto

然后重新安装:

go get -v github.com/ramya-rao-a/go-outline

3. 手动处理依赖

如果代理方法不行,可以手动下载所有依赖:

# 进入项目目录
cd $GOPATH/src/github.com/ramya-rao-a/go-outline

# 手动获取依赖
go get -d -v ./...

4. 检查并修复 GOPATH

确保你的环境变量正确设置:

# 检查当前生效的 GOPATH
go env GOPATH

# 如果显示不正确,重新设置
export GOPATH=/Users/jtr109/gopath
export PATH=$GOPATH/bin:/usr/local/go/bin:$PATH

5. 使用 vendor 模式

如果项目有 vendor 目录,可以尝试:

go install -mod=vendor github.com/ramya-rao-a/go-outline

6. 完整重试步骤

# 1. 清理环境
go clean -modcache
go clean -cache

# 2. 设置代理
export GOPROXY=https://goproxy.cn,direct

# 3. 重新获取
cd $GOPATH/src/github.com/ramya-rao-a/go-outline
go get -d -v ./...

# 4. 安装
go install github.com/ramya-rao-a/go-outline

验证安装

安装成功后验证:

which go-outline
go-outline -h

最常见的问题是 GOPATH 配置冲突或网络访问问题。使用 GOPROXY 设置通常能解决网络超时问题,而清理缓存可以解决路径查找问题。

回到顶部