如何解决如何解决import-local-package问题:忽略GOPATH,只有GOROOT生效
我是 GO 新手,已经在环境配置中卡住了几个小时。
我成功运行了一些测试项目,但是当我尝试导入我的自定义本地包(比如 xxx)时,“go run”命令失败,记录:
*test/main/main.go:6:2: package test/xxx is not in GOROOT (/usr/local/go/src/test/xxx)*
奇怪的是,在我的ubuntu计算机上导入本地包时,GOPATH似乎被忽略了。
go 版本是 go1.16.5 linux/amd64
GOPATH 是使用 export GOPATH="$HOME/goprojects"
设置的GOROOT 是使用 export GOPATH="/usr/local/go"
设置的GoMod 使用 go env -w GO111MODULE=on
编辑项目的.go文件后,在项目的根文件夹($GOPATH/src/test)中输入命令“go mod init”和“go mod tidy”,项目文件结构如下:
/src
/.vscode
-launch.json
/gitbub.com
/test
/main
-main.go (here: import "test/xxx")
/xxx
-xxx.go (here: package xxx)
-go.mod (almost empty - line 1: module test
line 2:
line 3: go 1.16 )
我应该怎么做才能解决这个问题?
解决方法
假设(从您的帖子中不清楚)整个树都在您的 $HOME/GoProjects
下。使用模块时;不要把你的项目放在 GOPATH 中,因为混合 GOPATH 和模块只会导致问题。
首先,将 $GOPATH
设置为 $HOME/go
之类的东西,您可以使用它来go get
跨项目使用的各种工具(例如 dlv
调试器等) 但不要把你的项目放在那里。
当开始一个新项目时,把它outside $GOPATH
放到 $HOME/GoProjects/test
(你可以保留你在 src
下的项目布局,但你不需要 {{ 1}} 那里):
src
在项目目录(此处为 GoProjects
/test
/main
-main.go
/xxx
-xxx.go
)中运行 test
,其中 NAME 是您的模块的名称。不要只使用 go mod init NAME
而是使用完全限定名称,这会将您的项目命名为您的“域”(例如 test
)。然后从模块导入包时将使用该名称。因此,在 github.com/yourusername/test
中,您将像这样导入 main.go
包(需要有 xxx
):
package xxx
在此处查看有关模块的更多信息:https://blog.golang.org/using-go-modules
,首先,不要担心GOPATH
。那是老东西,你不需要做
它了。然后,在 test
的某个地方创建一个文件夹(不需要是任何
用 GOPATH
做,只需放在当前目录,或任何你想要的地方)。然后
使test/xxx
。然后使test/xxx/xxx.go
:
package xxx
const X = 1
然后创建文件夹 test/main
。然后使test/main/main.go
:
package main
import "test/xxx"
func main() {
println(xxx.X)
}
然后返回test
,并执行go mod init test
。然后回到test/main
,
并做go build
。完成。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。