如何解决import-local-package问题:GOPATH被忽略,只有GOROOT生效

How to solve the import-local-package problem: GOPATH is ignored, only GOROOT takes effects

我是 GO 的新手,在环境配置中卡了几个小时。

我成功地 运行 一些测试项目,但是当我尝试导入我的自定义本地包(比如 xxx)时,“go 运行”命令失败,记录如下:

*test/main/main.go:6:2: package test/xxx is not in GOROOT (/usr/local/go/src/test/xxx)*

奇怪的是,在我的 ubuntu 计算机上导入本地包时,GOPATH 似乎被忽略了。

go版本是go1.16.5linux/amd64

GOPATH 使用 export GOPATH="$HOME/GoProjects"

设置

GOROOT 使用 export GOPATH="/usr/local/go"

设置

GoMod 使用 go env -w GO111MODULE=on

开启

编辑项目的.go文件后,在项目的根文件夹中输入命令"go mod init"和"go mod tidy"项目($GOPATH/src/test),项目文件结构如下:

/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     )

我应该怎么做才能解决这个问题?

首先,不要担心 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。完成。

假设(您的 post 不清楚)整棵树都在您的 $HOME/GoProjects 下。使用模块时;不要将你的项目放在 GOPATH 中,因为混合使用 GOPATH 和模块只会导致问题。

首先,将 $GOPATH 设置为 $HOME/go 之类的东西,您可以使用它来 go get 您想要跨项目使用的各种工具(例如 dlv 调试器和等等)但是不要把你的项目放在那里

当开始一个新项目时,把它放在 outside $GOPATH$HOME/GoProjects/test (你可以保留你在 src 下的项目布局,但是你那里不需要 src):

GoProjects
  /test
    /main
      -main.go
    /xxx
      -xxx.go

在项目目录中(此处 test)运行 go mod init NAME 其中 NAME 是您的模块的名称。不要只使用 test 而是完全限定的名称,这会将您的项目命名为您的“域”(例如 github.com/yourusername/test)。从您的模块导入包时将使用该名称。所以在 main.go 中你将像这样导入 xxx 包(需要有 package xxx):

import "github.com/yourusername/test/xxx"

在此处查看有关模块的更多信息:https://blog.golang.org/using-go-modules