x/tools/gopls: 文档如何运行守护进程在docker中

b5buobof  于 6个月前  发布在  Go
关注(0)|答案(5)|浏览(44)

你正在使用的Go版本是(go version)?
go1.12.17 darwin/amd64
这个问题在最新版本的gopls 0.4.4中是否重现?
是的,最近版本的gopls 0.4.4
你正在使用什么操作系统和处理器架构(go env)?

GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/ninja/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/ninja/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/ninja/Documents/<name>/<project>/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/65/7_p4zdgn2llfqf6fvn1zymjw0000gn/T/go-build716194075=/tmp/go-build -gno-record-gcc-switches -fno-common"

你做了什么?
我正在尝试为neovim设置内置的lsp。但是我对linux有依赖关系来构建源代码,而不能在其上构建。所以我尝试设置Docker gopls服务器监听在7050端口。
Dockerfile

FROM golang:1.12.16-stretch
RUN apt-get update && apt-get install -y libudev-dev

ARG GOPATH
ENV GOPATH $GOPATH

ARG MY_PWD
ENV MY_PWD ${MY_PWD}

RUN mkdir -p $GOPATH
RUN mkdir -p $MY_PWD

ENV PATH="/usr/local/go/bin:$GOPATH/bin:${PATH}"
RUN GOPROXY=https://proxy.golang.org GO111MODULE=on go get golang.org/x/tools/gopls@latest
WORKDIR $MY_PWD

CMD /go/bin/gopls  -listen=":7050"

我打开了nvim,它抛出了与我在mac上得到的相同的构建错误。
Neovim配置

:lua << EOF
require'nvim_lsp'.gopls.setup{
cmd = {"gopls","-remote","localhost:7050"};
}
EOF

我最初尝试使用这个docker设置一个简单的hello world示例,这可以工作。但现在我不确定它是否实际上是在docker内部编译并将结果传递到外部,还是只是在mac本身上编译。
Gopls在docker内部监听时,除了连接和退出之外,不提供任何日志(至少当我运行docker logs时)。

PS:我执行了docker命令并构建了源代码,它按预期工作。

你期望看到什么?
我希望gopls -remote在docker内部构建源代码并将结果返回给客户端。
你看到了什么?
我看到了与我在mac上得到的相同的构建错误,这可能意味着gopls没有将命令转发到远程并在本地执行。

iaqfqrcu

iaqfqrcu2#

如果你从Docker内部的守护进程看到连接日志,那么你确实正在连接到守护进程,gopls应该正在转发LSP。
你的构建错误是什么性质?我的猜测是这可能与gopls转发器也转发go env有关,也就是说它转发了GOOS。如果这很可能是问题所在,你可以尝试使用GOOS=linux运行neovim以确认。
一旦我们弄清楚这个问题,我们应该更新环境转发逻辑:你试图做的事情似乎是支持的一个有价值的用例。
我还要指出,在go1.12上使用gopls可能会有问题。我们对比最后两个版本更新的Go版本的支持是尽力而为的,尽管我们确实确保gopls编译和测试通过(这是我们最近添加到我们的CI的内容)。

wqnecbli

wqnecbli3#

顺便说一下,我预计在docker中运行gopls守护进程时还会遇到其他问题。具体来说,文件URI可能会不正确。然而,对于darwin->linux系统,它可能可以正常工作。我假设你已经将工作区挂载到了完全相同的绝对路径。
工作区之外的链接(在GOROOTGOPATH)可能会中断。

n7taea2i

n7taea2i4#

感谢帮助!GOOS=linux 工作了。
是的,在路径上,我在Docker中创建了绝对路径以使其正常工作,并且在Docker go is已安装在/usr/local/goGOROOT=/usr/local/go上,但在我的Mac上,因为我必须安装一个较旧的go版本,所以它安装在了/usr/local/Cellar/go@1.12/1.12.17/libexec/上。现在我已经将它链接到了/usr/local/go并更改了Mac上的GOROOT,以便两者都能正常工作。但是如果能在Docker内部使用go环境,而不仅仅是发送GOPATH,那将会很有帮助,因为我认为这并不合理。

q35jwt9p

q35jwt9p5#

太好了,谢谢你的确认。你已经做了我一直想尝试一段时间的事情 :)
将这个问题重新利用来跟踪记录和简化这个守护进程的使用案例。

相关问题