这是一个前后端在同一个总目录下的情况,下图是后端代码的位置,当我在总目录下打开这个项目时,vscode 总是提示我如下错误
could not import cloud.lazycat.shell.settings/boxhelper (cannot find package "cloud.lazycat.shell.settings/boxhelper" in GOROOT or GOPATH)
但是当我将 src 文件作为 vscode 的工作根目录时,一切又正常。
下面是我的 go env
问题1:为什么会出现上面的情况?
问题2:能否实现在前后端总项目作为工作的根目录的情况下,vscode 工作正常?(也就是go不会报错)
先简单回答一下第一个问题,这个和你的目录包的设置有关(你可以先给出一下go.mod,我看看);第二个,可以,需要进行replace
首先让我们来看一下 Go 的包管理:
Go 语言使用包(Package)作为代码的组织单位,每个 Go 程序都是由包组成的,并且程序从 main 包开始运行。Go 应用程序通常由一组多个包组成。
开始时,Go 倾向于使用全局的 GOPATH 作为工作区间的目录,并且会在这个目录下存放所有的 Go 代码,包括你自己的和第三方的。这就意味着所有的代码和依赖都会在同一个地方。
Go 引入go mod。Go Modules 允许我们的项目可以在任何位置,不一定需要在 GOPATH 中。
接下来,我们来看一下 Go 的路径引入:
如果你在 Go 文件 import "github.com/gin-gonic/gin",那么这其实就是一个包的导入路径。Go 会根据这个路径去 GOPATH 或者 GOROOT 中查找对应的包。
在使用 Go Modules 的时候,你可以以模块路径(module path)作为一个基础路径(基本上就是你的 module 名称,比如 "github.com/myname/myproject")。你的其它包可以以这个基础路径为基础,建立在你的项目的子目录中。
因此,包管理和路径引入之间有着紧密的关系。包管理决定了你的代码和依赖的物理组织方式,而路径引入决定了你的代码如何在逻辑上连接和使用这些包。在 Go Modules 的辅助下,这两者可以更加灵活和便捷地工作。