本地运行 Go Tour 时出错:找不到游览文件:找不到 go-tour 内容;

go version go1.12.9 darwin/amd64


安装该golang.org/x/tour软件包后,我运行命令tour并收到错误:


Couldn't find tour files: could not find go-tour content; check $GOROOT and $GOPATH

这是输出go env:


GOARCH="amd64"

GOBIN=""

GOCACHE="/Users/elk/Library/Caches/go-build"

GOEXE=""

GOFLAGS=""

GOHOSTARCH="amd64"

GOHOSTOS="darwin"

GOOS="darwin"

GOPATH="/Users/elk/ccode/go"

GOPROXY="https://goproxy.io"

GORACE=""

GOROOT="/usr/local/go"

GOTMPDIR=""

GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"

GCCGO="gccgo"

CC="clang"

CXX="clang++"

CGO_ENABLED="1"

GOMOD="/dev/null"

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/5d/q9dj2fxx4t71w0g5g00cvlkh0000gn/T/go-build144784202=/tmp/go-build -gno-record-gcc-switches -fno-common"

我在里面添加两行.zshrc:


export GOPATH="$HOME/ccode/go"

export PATH="$PATH:$GOPATH/bin"

该命令go get golang.org/x/tour运行时没有错误。


奇怪的是: echo $GOROOT会显示一个空行并且echo $GOPATH与 一致go env。


慕桂英3389331
浏览 167回答 4
4回答

繁华开满天机

可能是你通过 GO111MODULE = on 显式启用了 go 模块,然后tour的代码下载到$GOPATH/pkg/mod/golang.org/x/tour@v0.0.0-20191002171047-6bb846ce41cd目录下,但是tour程序通过ctx.Import查找tour src代码dir,此时只会 from $GOROOT/src/golang.org/x/touror $GOPATH/src/golang.org/x/tour,而不会 from $GOPATH/PKG/mod,所以导致 can not找到旅游源代码目录。解决方案:解决方案1:复制$GOPATH/pkg/mod/golang.org/x/tour@v0.0.0-20191002171047-6bb846ce41cd到$GOPATH/src/golang.org/x/tour方案二:修改游览源local.go文件func findRoot() (string, error) {    ...    if os.Getenv("GO111MODULE") == "on" {        pkgDir := filepath.Join(os.Getenv("GOPATH"), "pkg", "mod")        cfg := &packages.Config{Mode: packages.LoadFiles, Dir: pkgDir}        pkgs, _ := packages.Load(cfg, basePkg)        for _, pkg := range pkgs {            for _, goFile := range pkg.GoFiles {                root := filepath.Dir(goFile)                if isRoot(root) {                    return root, nil                }            }        }    }    return "", fmt.Errorf("could not find go-tour content; check $GOROOT and $GOPATH")}

森林海

对于遇到此问题并且只想进行游览的任何人,您可以随时导航到$HOME\go\pkg\mod\golang.org\x\tour@version,然后执行以下操作go run .

缥缈止盈

我看到了同样的问题。按照Andy的回答,问题仍然没有解决。我查了local.go文件中findRoot函数的代码,它依赖于build.Default,也就是build.defaultContext()的返回值。它返回从环境变量读取 GOPATH 的默认上下文。从源代码build/build.go我看到:func defaultContext() Context {    var c Context    c.GOARCH = envOr("GOARCH", runtime.GOARCH)    c.GOOS = envOr("GOOS", runtime.GOOS)    c.GOROOT = pathpkg.Clean(runtime.GOROOT())    c.GOPATH = envOr("GOPATH", defaultGOPATH())    // code omitted    return c}但是,当我们使用go env -w GOPATH="/Users/elk/ccode/go"命令设置 GOPATH 时,该值仅保存在 go env 中,而不保存在您的系统环境中。因此,当您运行游览时,由于 GOPATH 为空,因此它使用默认路径值,通常是/Users/elk/go,这会导致找不到游览内容。这可能是因为《围棋之旅》是2011年写的,当时我们还需要设置GOPATH环境变量。但后来 Go 改进了设置,但是 go 之旅中的遗留代码并没有相应改变。因此,一个快速的解决方案是在 .bashrc 文件中设置 GOPATH 变量。或者只是export GOPATH="Users/elk/ccode/go"在运行游览程序之前在命令行中临时使用。

明月笑刀无情

尝试以下步骤:出发GO111MODULE_   export GO111MODULE=off确保您不在$GOPATH目录内(如果在目录内,只需运行cd ~)运行go get命令   go get golang.org/x/tour
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go