【问题标题】:Error about running Go Tour locally: Couldn't find tour files: could not find go-tour content; check $GOROOT and $GOPATH在本地运行 Go Tour 时出错:找不到游览文件:找不到 go-tour 内容;检查 $GOROOT 和 $GOPATH
【发布时间】:2021-09-12 17:49:15
【问题描述】:

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 $GOPATHgo env一致。

【问题讨论】:

  • 您在更改.zshrc 文件后是否运行source 命令?此外,尝试写入.bash_profile 文件中与.zshrc 存储的行类似的行。然后$ source ~/.bash_profile。让我知道它是否有帮助
  • @Mykhailo Tkachenko 感谢您的提醒,但我之前使用过source 命令,并且我尝试过.zshrc.bash_profile
  • 嗯,有我的bash_profile 文件,并且在源命令之后每个环境变量都不为空:export PATH=$PATH:$GOPATH/bin export GOPATH="$HOME/go" export GOROOT=$HOME/go
  • 删除导出命令中的双码。这对我有用.. !!

标签: go


【解决方案1】:

可能是你通过GO111MODULE=on显式开启go模块,然后将tour的代码下载到$GOPATH/pkg/mod/golang.org/x/tour@v0.0.0-20191002171047-6bb846ce41cd目录下,但是tour程序通过ctx.Import查找tour src代码dir,此时只会从$GOROOT/src/golang.org/x/tour或@ 987654323@,但不是来自$GOPATH/PKG/mod,所以导致找不到tour src code dir。

解决方案:

解决方案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")
}

【讨论】:

    【解决方案2】:

    我看到了同样的问题。并且按照安迪的回答问题仍然没有解决。我查看了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" 以供临时使用,然后再运行游览程序。

    【讨论】:

      【解决方案3】:

      试试这些步骤:

      1. 设置GO111MODULE关闭
         export GO111MODULE=off
      
      1. 确保您不在$GOPATH 目录中(如果在,只需运行cd ~
      2. 运行go get 命令
         go get golang.org/x/tour
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-09-28
          相关资源
          最近更新 更多