Build “开始构建”:;找不到包“;(即使设置了GOPATH)
即使我已经正确设置了Build “开始构建”:;找不到包“;(即使设置了GOPATH),build,go,package,Build,Go,Package,即使我已经正确设置了GOPATH,我仍然无法获得“go build”或“go run”来找到我自己的包。我做错了什么 $ echo $GOROOT /usr/local/go $ echo $GOPATH /home/mitchell/go $ cat ~/main.go package main import "foobar" func main() { } $ cat /home/mitchell/go/src/foobar.go package foobar $ go build
GOPATH
,我仍然无法获得“go build”或“go run”来找到我自己的包。我做错了什么
$ echo $GOROOT
/usr/local/go
$ echo $GOPATH
/home/mitchell/go
$ cat ~/main.go
package main
import "foobar"
func main() { }
$ cat /home/mitchell/go/src/foobar.go
package foobar
$ go build main.go
main.go:3:8: import "foobar": cannot find package
编辑:由于您指的是GOPATH,请参见的(向上投票) 如“”中所述,您需要将包
xxx
放入目录xxx
见:
共享相同的PackageName
的一组文件构成了包的实现。实现可能要求包的所有源文件位于同一目录中 报告提到: 在构建导入包“
widget
”的程序时,go
命令会在go根目录中查找src/pkg/widget
,如果在那里找不到包源,则会在每个工作区中按顺序搜索src/widget
(一个“工作区”是您的GOPATH
中的一个路径条目:该变量可以为您的“src、bin、pkg
”引用多个路径)
(原答覆) 您还应该设置为~/go,而不是
GOROOT
,如“”所示
Go路径用于解析导入语句。它由go/build包实现并记录在其中
GOPATH
环境变量列出了查找Go代码的位置。在Unix上,该值是以冒号分隔的字符串。
在Windows上,该值是以分号分隔的字符串。
在计划9中,该值是一个列表 这与GOROOT不同: Go二进制发行版假定它们将安装在
/usr/local/Go
(或Windows下的c:\Go
)中,但也可以将它们安装在其他位置。如果执行此操作,则在使用Go工具时需要将
GOROOT
环境变量设置为该目录
您是否尝试将go的绝对目录添加到您的“路径”中
export PATH=$PATH:/directory/to/go/
它不起作用,因为您的
foobar.go
源文件不在名为foobar
的目录中go build
和go install
尝试匹配目录,而不是源文件
$GOPATH
设置为有效目录,例如export GOPATH=“$HOME/go”
foobar.go
到$GOPATH/src/foobar/foobar.go
,建筑应该可以正常工作PATH=“$GOPATH/bin:$PATH”
main。转到$GOPATH/src
的子文件夹,例如$GOPATH/src/test
go install test
现在应该在$GOPATH/bin
中创建一个可执行文件,可以通过在终端中键入test
来调用该文件TL;博士:遵循围棋惯例!(从艰苦的道路中学到的教训),检查旧的围棋版本和它们。安装最新版本 对我来说,解决办法是不同的。我在一台共享Linux服务器上工作,在多次验证我的
GOPATH
和其他环境变量之后,它仍然不起作用。我遇到了几个错误,包括“找不到包”和“无法识别的导入路径”。在尝试按说明重新安装解决方案后(包括零件),仍然遇到问题
我花了一些时间才意识到还有一个旧版本尚未卸载(运行
go version
然后再次运行,这让我产生了疑问,并最终得到了解决。尽管公认的答案仍然正确,即需要将目录与包名匹配,您确实需要迁移到使用Go模块,而不是使用GOPATH。遇到这个问题的新用户可能会对提到使用GOPATH(就像我一样)感到困惑,因为GOPATH现在已经过时了。因此,我将尝试澄清这个问题,并在使用Go模块时提供与预防这个问题相关的指导
如果您已经熟悉围棋模块,并且遇到了这个问题,请跳到下面我更具体的部分,其中包括一些容易忽略或忘记的围棋惯例
本指南介绍Go模块:
具有Go模块的项目组织
迁移到Go模块后(如文章中所述),请按如下所述组织项目代码:
存储库包含一个或多个模块。模块是一组
一起发布的相关Go包。围棋库
通常只包含一个模块,位于
存储库。其中名为go.mod的文件声明了模块路径:
模块内所有包的导入路径前缀。模块
包含目录中的包,其中包含go.mod文件,如下所示
以及该目录的子目录,直到下一个子目录
包含另一个go.mod文件(如果有)
每个模块的路径不仅作为其模块的导入路径前缀
包,但也指示go命令应查找的位置
下载它。例如,为了下载模块
golang.org/x/tools,go命令将查询存储库
表示为(此处详细描述)
导入路径是用于导入包的字符串。包裹
导入路径是其模块路径与其在
模块。例如,模块github.com/google/go-cmp包含
目录cmp/中的包。该包的导入路径为
github.com/google/go-cmp/cmp。标准库中的程序包不支持
具有模块路径前缀
您可以如下方式初始化模块:
$ go mod init github.com/mitchell/foo-app
/my-app
├── go.mod
├── /src
├── main.go
└── /utils
└── utils.go
module git.mydomain.com/path/to/repo/my-app
go 1.14
import "git.mydomain.com/path/to/repo/my-app/src/my-app"
您的代码不需要位于github.com上就可以生成。然而,最好的做法是将模块组织为最终发布的模块
了解获取包裹时发生的情况
这里有一篇很棒的文章
module git.mydomain.com/path/to/repo/my-app
go 1.14
import "git.mydomain.com/path/to/repo/my-app/src/my-app"
go env -w GO111MODULE=off
/app
├── main.go
├── /utils
└── utils.go
package main
import(
"app/util"
)