背景:win11系统下,原有的go1.18更新到go1.19后出现了莫名的go: no sucn tool "compile"的情况。
当时检查go env,如下:
PS D:\Desktop> go env
set GO111MODULE=off
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\user\AppData\Local\go-build
set GOENV=C:\Users\user\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=D:\documents\gocourse\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=D:\software\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=D:\documents\gocourse
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=D:\software\go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.19.2
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set GOWORK=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\user\AppData\Local\Temp\go-build126469990=/tmp/go-build -gno-record-gcc-switches
解读一下:上面的gocourse目录是我旧版本的go项目所在,而software下面的go文件夹则是go的安装路径,所以照理来说,GOPATH应该是项目路径,然后GOROOT应当是安装路径才对,但新版本安装后,啥都反过来了。连带着GOTOOLDIR参数都跟着乱了。
另外,上面报错出现的地方其实就是一个简单的hello初级包的测试,我在run的时候直接给我报这个错误。
PS D:\Desktop>go run test.go
go: no sucn tool "compile"
go: no sucn tool "compile"
go: no sucn tool "compile"
关于compile包,其实是安装路径下pkg包下的对应系列软件,windows的话就是windows_amd64,linux则是linux_amd64之类的参数。
折腾的开始
根据某某某网友的提示,我找了旧版本的go来重装,当然首先是卸载了原有go版本的,另外env设置文件是由专门的保存路径的,也需要删除,文件路径就是C:\Users\penta\AppData\Roaming\go下的env文件。因为新版本已经有比较完整的生态,可以直接在控制面板上面进行卸载程序,卸载完成后,顺带把环境变量也删了一批。重新打开win11终端。
右键打开了终端,重新检查一下版本,嗯,版本ok,检查参数,OH!My eye!
PS D:\Desktop> go env
set GO111MODULE=off
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\user\AppData\Local\go-build
set GOENV=C:\Users\user\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=D:\documents\gocourse\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=D:\software\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=D:\documents\gocourse
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=D:\software\go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.18.7
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set GOWORK=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\user\AppData\Local\Temp\go-build126469990=/tmp/go-build -gno-record-gcc-switches
继续折腾
没办法,那就修改设置吧,
PS D:\Desktop>go env -w GOPATH=D:\documents\gocourse
go env -w GOPATH=... does not override conflicting OS environment variable
嗯?这又什么鬼,为啥不让修改。继续百度。。。。。。没一个有用资料,都是叫unset GOPATH,但系统不识别你这个指令啊!这里不行,那就直接在用户变量里面进行定制吧。
心想,这样总可以了吧?嗯,继续go env
^%$&%*((,简直骂人,然后某位网友又有建议了,用超级用户模式来设置这个参数,嗯,管理员打开cmd,先看看参数,go env,嗯。。。。。。
C:\Windows\system32>go env
set GO111MODULE=off
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\user\AppData\Local\go-build
set GOENV=C:\Users\user\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=D:\documents\gocourse\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=D:\documents\gocourse
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=D:\software\go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=D:\software\go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.18.7
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=
set GOWORK=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\user\AppData\Local\Temp\go-build126469990=/tmp/go-build -gno-record-gcc-switches
这不就改好了吗?为什么powershell不更新的?????没法子,只好重启一下,嗯,好了。运行一下:
PS D:\Desktop> go run test.go
Hello, I' m your father.
真的是。。。。。。