喵哥最近在學習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
成功了。。。
大概總結的經驗就是:軟件的缺陷不應該成爲懲罰自己的武器:)