你正在使用的Go版本是什么( go version
)?
$ go version
go version go1.14.7 darwin/amd64
# gopls version
golang.org/x/tools/gopls 0.4.4
golang.org/x/tools/gopls@v0.4.4 h1:8djGYsaZ0ByP0vaXg4T+mnyfDcHpWKSZ+tpQSGv9ahk=
VS Code版本v1.47.3
vscode-go v0.16.1
这个问题在最新版本的发布中是否重现?
是的
你正在使用什么操作系统和处理器架构( go env
)?
go env
输出
$ go env
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/segev/Library/Caches/go-build"
GOENV="/Users/segev/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/segev/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/usr/local/Cellar/go/1.14.7/libexec"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/Cellar/go/1.14.7/libexec/pkg/tool/darwin_amd64"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
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/b_/c6yh0ksn63d1yy192x2p9f4c0000gn/T/go-build425202633=/tmp/go-build -gno-record-gcc-switches -fno-common"
你做了什么?
- 使用Go模块创建两个新包:
mkdir foo && cd foo
go mod init github.com/segevfiner/foo
cd ..
mkdir bar && cd bar
go mod init github.com/segevfiner/bar
cd ..
- 用安装了vscode-go并启用了gopls的VS Code打开:
code foo bar
- 将
replace github.com/segevfiner/bar => ../bar
添加到模块foo
's go.mod。 - 以
foo
为main.go
添加到模块:
package main
func main() {
}
- 以
bar
为bar1.go
添加到模块:
package bar
func Bar1() {
}
- 尝试将
foo.Bar1()
添加到foo
'smain.go
,它将起作用并且也会自动完成。 (可能需要手动添加导入语句) - 以
bar
为bar2.go
添加到模块:
package bar
func Bar2() {
}
- 尝试将
foo.Bar2()
添加到foo
'smain.go
,它将不会自动完成且在重启语言服务器之前无法编译。
你期望看到什么?
向已替换的包中添加新文件应该无缝工作,自动完成,正确编译,无需重启语言服务器。
你看到了什么?
它无法自动完成、编译等(与 go build
一起正常工作),直到你重启语言服务器。
8条答案
按热度按时间qmb5sa221#
这实际上是一个已知的问题,应该在主分支(https://golang.org/cl/245327)上解决。如果你感兴趣,可以尝试下载主分支(
GO111MODULE=on go get golang.org/x/tools/gopls@master golang.org/x/tools@master
)并进行尝试。js5cn81o2#
尝试使用(通过提供的命令安装):
情况更糟,现在它根本找不到被替换的模块,并抱怨:
而
go build
可以正常工作。gopls -rpc.trace -v check foo.go
日志
bhmjp9jg3#
看起来你正在打开
/Users/segev/junk/gopls-issue2
文件夹作为工作区根目录,但是go.mod
文件包含在/Users/segev/junk/gopls-issue2/foo
中。主分支上的gopls
仍然期望你的模块根目录是工作区的根目录。t5zmwmid4#
哦,等等...该死...VS Code 打开了文件夹,而不是其中的工作区文件...(也许我忘了保存工作区文件)
看来即使我正确地在工作区下打开了项目,原始问题仍然存在。
日志
p3rjfoxz5#
为了澄清,你是如何将
replace
添加到你的模块中的?我没有在你的日志中看到对模块的任何编辑,如果你是在不同的编辑器中做的,你可能实际上已经抓住了一个刚刚被 https://golang.org/cl/247684 修复的文件监视错误(尽管 CL 标题说它仅限于 Windows-specific,但这并不局限于此)。我建议你升级到几分钟前最新的主版本(GO111MODULE=on go get golang.org/x/tools/gopls@master golang.org/x/tools@master
)-对于造成的不便深表歉意!ntjbwcob6#
在这种情况下,我已经将
replace
安装好了,并在替换后的bar
模块中添加了一个带有新功能的文件。稍后会尝试一下。eaf3rand7#
感谢您的澄清。我们当然可以为这种情况添加回归测试。
hmmo2u0o8#
仍然在发生: