如何解决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
我是 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