喵哥最近在学习Go语言的过程中发现之前编写C++还管用的YCM“不香了”,Go的代码一直要靠自己敲完。为了方便管理代码,喵哥一直在阿里云服务器上编写,但是本地的Golang是真的好用,搞得心里膈应。一开始,还能用“熟悉Go语言”的借口说服自己,随着代码量的增加,心里开始犯嘀咕了。
其实,经过几分钟查找,喵哥就发现了主要原因:
喵哥之前编译的YCM是针对C++的,编译的命令为:
./install.sh --clang-completer
现在要对Go语言支持,需要用命令编译:
./install.sh --gocode-completer
此外,java、JavaScript、rust对应的编译命令分别为:
./install.sh --java-completer
./install.sh --ts-completer
./install.sh --rust-completer
然而,事情没那么简单,运行完报错了:
main.go:15:2: cannot find package "golang.org/x/tools/internal/lsp/cmd" in any of:
main.go:16:2: cannot find package "golang.org/x/tools/internal/tool" in any of:
其实根据上面的两个错误直接搜索可以很快捷地搜到想要地结论:在/usr/lib/go-1.10/src/或/usr/share/go-1.10/src(两者是软链接关系)下新建目录:golang.org/x,然后在/usr/lib/go-1.10/src/golang.org/x下从github克隆一个文件夹tools:
git clone https://github.com/golang/tools
然而,再次执行./install.sh --gocode-completer编译YCM时,又出现了问题:
/usr/lib/go-1.10/src/golang.org/x/tools/internal/lsp/cache/analysis.go:12:2: cannot find package "golang.org/x/sync/errgroup" in any of:
……
main.go:15:2: use of internal package not allowed
main.go:16:2: use of internal package not allowed
/usr/lib/go-1.10/src/golang.org/x/tools/internal/lsp/protocol/span.go:13:2: cannot find package "golang.org/x/xerrors" in any of:
……
其实是类似地问题,但是网上并没有直接地告知去克隆哪一个目录。还好机智的喵哥发现了一个秘密:刚刚克隆的地址的上一级就是一个Go语言的依赖集合:https://github.com/golang?page=1
在其中可以很容易找到需要的目录:
然后就是照葫芦画瓢:
git clone https://github.com/golang/sync
git clone https://github.com/golang/xerrors
现在是没有报缺少依赖包的错误了,但是出现了另外一个棘手的问题:
main.go:15:2: use of internal package not allowed
main.go:16:2: use of internal package not allowed
这个问题耗了很久,大概了解了一下,go中用vendor来管理第三方依赖包,算是external(外包),但是这里说的是内包的问题,喵哥把几个文件夹的位置换了又换,可是还是没有解决。
看了下服务器的go语言的版本是1.10.4,干脆把它升级到最新的版本,算是不破不立。
#卸载旧的Go
sudo rm -rf /usr/local/go
sudo rm -rf /usr/bin/go
sudo rm -rf /usr/bin/gofmt
sudo rm -rf /usr/lib/go-1.10/
#安装新的Go
wget https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz
tar -xzf go1.13.4.linux-amd64.tar.gz -C /usr/local
sudo ln -s /usr/local/go/bin/* /usr/bin/
Go的环境变量没有变化,就不修改了。
喵哥好奇去看了下新的版本有啥区别,发现这个版本的golang.org/x文件夹在vendor中已经存在,并且包含了部分之前不存在的包。
然后就直接去编译YCM,发现有了新问题。。。
go: golang.org/x/[email protected]: Get https://proxy.golang.org/golang.org/x/net/@v/v0.0.0-20190311183353-d8887717615a.mod: dial tcp 216.58.200.49:443: i/o timeout
这个主要是因为被和谐了,加上一个全局代理即可:
export GOPROXY=https://goproxy.io
后续……
喵哥成功编译了支持go的YCM,但是在使用的过程中还是不能提示补全代码。经过喵哥升级vim8.0到8.1(没用),更换新的ycm,
git clone https://github.com/ycm-core/YouCompleteMe
成功了。。。
大概总结的经验就是:软件的缺陷不应该成为惩罚自己的武器:)