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