LiteIDE and Go1.11 modules

Go1.11 modules 出来后,LiteIDE 的 gotools & gocode 作了相应的支持处理。 Go 为了支持 Go modules, 实现了 golang.org/x/tools/go/packages 包(内部使用 go list -json -deps 实现), 而 LiteIDE 使用的 gotools/types 没有使用这个包,内部使用 go list -m -json all 实现对 Go modules 的解析。 使用 go list -e -json pkgname 对 deps 包进行解析.

issues

在 LiteIDE X34.2 发布后,gohugoio/hugo 作者提出问题 https://github.com/visualfc/liteide/issues/986, 即 LiteIDE 对于类似 gohugoio/hugo 这种有上百个包依赖的 Go modules 项目解析过于缓慢。

fastmod

为了解决这个问题,对 Go1.11 的 cmd/go 命令进行测试研究,从代码出提取 module 文件分析部分,以只读方式对项目的 go.mod 文件进行读取分析,以加速解析过程。最终实现项目为 https://github.com/visualfc/fastmod 提供了 go.mod 解析, 目前为了兼容考虑 go.mod 文件由命令 go env GOMOD 提供路径。

使用方法如下:

modList := fastmod.NewModuleList(&build.Default)
mod, err := modList.LoadModule(dir)
if err != nil {
    return
}
path, dir := mod.Lookup(pkg)

利用这个新实现的 fastmod,gotools & gocode 实现了对 gohugoio/hugo 项目的快速分析, 解决了这个 issues 。

更新 gotools & gocode

通过以下命令可以更新 LiteIDE 的 gotools & gocode

go get -u github.com/visualfc/gotools
go get -u github.com/visualfc/gocode

Windows/Linux: copy GOPATH/bin gotools and gocode to liteide/bin
MacOS: copy GOPATH/bin gotools and gocode to LiteIDE.app/Contents/MacOS


Published

2018-10-12

Categories


Tags