将go tour放在本地运行(windows)
前几天看了下golang官网上的go tour,感觉做的挺不错的,对于我这种有其他语言基础,来学习go的话,非常方便。地址为https://tour.go-zh.org
在https://tour.go-zh.org/welcome/3有提到
本指南也可作为独立的程序使用,这样你无需访问互联网就能运行它。 独立的 tour 更快,它会在你自己的机器上构建并运行代码示例。 要在本地安装并运行此教程的中文版,请在命令行执行: go get -u github.com/Go-zh/tour tour
然后我就想动手试试,天真的我以为就一句命令的事情,后来才发现我是多么的naive
首先 我已经下载并安装好了go环境
然后我打开命令行输入了这句命令go get -u github.com/Go-zh/tour tour
报错如下
package golang.org/x/net/websocket: unrecognized import path "golang.org/x/net/websocket": https fetch: Get "https://golang.org/x/net/websocket?go-get=1": dial tcp 142.251.43.17:443: connectex: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
package tour: unrecognized import path "tour": import path does not begin with hostname
从报错信息来看有两个,第一是网络问题,第二是命令格式问题
首先解决网络问题。按照https://blog.csdn.net/qq_35941092/article/details/104986253和https://mirrors.aliyun.com/goproxy/,就可以解决网络问题了。
然后重新运行命令,输出为
go get: malformed module path "tour": missing dot in first path element
估计是因为我的版本比较新,这个tour的代码太老了,go get命令接受的参数格式有了变化??
我就没计较了,把最后一个tour给去掉,运行
go get -u github.com/Go-zh/tour
这回就没有报错了,天真的我以为就要成功了。相关的文件被下载到gopath环境变量指向的目录中,其中%gopath%/pkg/mod中有源代码,%gopath%/bin中有tour.exe
我直接用命令行运行%gopath%/bin/tour.exe,报错
Couldn't find tour files: could not find go-tour content; check $GOROOT and $GOPATH
我就无语了,tour程序相关的文件明明就在%gopaht%\pkg\mod\github.com!go-zh\[email protected],为什么就找不到呢
问题出在github.com!go-zh\[email protected]\local.go这个文件的findRoot函数上。tour程序通过这个函数来查找代码的目录,从而找到go-tour的相关数据内容。
这个函数通过go.build.Import自己的代码来找到代码目录,但使用的是gopath模式,和目前新版go的module模式不兼容。即使我把findRoot函数的返回值强行改为正确的路径,后面tour的代码还需要调import "golang.org/x/tour/pic"等其他包,还是会报错
经过几个小时的折腾,我终于发现了个能正常运行的方法。
1、新建一个目录,用git clone https://github.com/Go-zh/tour.git把代码下载下来
2 进入tour目录,把tour\vendor\golang.org路径改为tour\vendor\src\golang.org,即在中间新建一个src的文件夹,把golang.org的东西拖进去
3 设置gopath环境变量:set "GOPATH=%somepath%\tour\vendor" 运行go env -w GO111MODULE=auto
4 在tour路径下执行go build,生成build.exe并运行就可以了
这波折腾下来虽然啥也没写,但是把go的包管理和查找了解的多了一些。
这个文章https://www.cnblogs.com/wongbingming/p/12941021.html给了我很大的帮助,让我从宏观上了解了go的包管理的发展过程
gotour这次出现的问题,第一次找不到content是应为gopath和module不兼容,通过gopath当然找不到pkg/mod里面的内容
第二次找不到golang.org/x/tour/pic等内容,是因为tour中使用了github.com!go-zh\tools\playground\socket来运行网页上面提交的代码,而socket.go中是使用go build命令来编译提交的代码,这里又涉及到gopath的设置问题。所以我直接把gopath设置到vender目录,因为go默认会去找%gopath%/src,所以我加了层src
不管怎么说,终于折腾好了。