Go编译器的“no such file or directory”是什么意思?

4

我正在尝试编译一个由多个模块组成的 Go 程序,例如:

// main.go
package main
import "mst"
// do something interesting involving minimum spanning trees

// src/mst/kruskal.go
import "disjsets"
// Kruskal's algorithm follows

// src/disjsets/disjsets.go
// implements disjoint sets with union-find

现在,在包含main.gosrc两个文件夹的目录中执行export GOPATH=.命令后,无论是运行go run main.go还是go build命令,都会输出结果。请保留HTML标记。
# disjsets
open src/disjsets/disjsets.go: No such file or directory

我不理解这个。如ls -l src/disjsets/disjsets.go所示,该文件已经存在。为什么会这样?如果要让Go找到disjsets.go文件,它应该放在哪里呢?
(谷歌Go 1.0.2)

2
你可能需要修改你的问题主题,编译器并不会“撒谎”,所以你的问题答案已经在那里了,意思是“没有这样的文件或目录”。你的问题不是它的意思,而是为什么它会这样说(如果文件存在)。 - Lee Jarvis
你在哪里执行 export GOPATH=. 命令? - zzzz
@jnml:在包含 main.gosrc 的目录中。 - Fred Foo
3
就像那个关于迷失的直升机在微软总部周围飞行的笑话一样。 :-( - zzzz
2个回答

8

我认为你应该阅读或重新阅读如何编写Go代码

简而言之:

将您的GOPATH设置到某个位置并永久导出它。然后将一些包blah放入目录中。

$GOPATH/src/foo/bar/baz/blah # (1)

或者

$GOPATH/src/blah # (2)

或者

$GOPATH/src/qux/blah # (3) etc.

blah 导入其他包中作为。
import "foo/bar/baz/blah" // (1)

或者

import "blah" // (2)

或者

import "qux/blah" // (3)

该目录中的软件包将包含软件包文件。假设您只有一个名为blah.go的文件。那么它的位置应该是:

$GOPATH/src/foo/bar/baz/blah/blah.go // (1)

$GOPATH/src/blah/blah.go // (2)

$GOPATH/src/qux/blah/blah.go // (3)

如果blah软件包源文件被命名为proj.go,那么
$GOPATH/src/foo/bar/baz/blah/proj.go // (1)

$GOPATH/src/blah/proj.go // (2)

$GOPATH/src/qux/blah/proj.go // (3)

但导入路径与前面的情况相同。

考虑提到 export GOPATH=... 应该出现在 ~/.bashrc~/.profile 中,这样它就不会特定于某个 shell。 - weberc2

3

好的,这似乎解决了问题:

export GOPATH=`pwd`

显然,它需要是一个绝对路径。虽然我仍然觉得错误信息很令人困惑。


2
我建议将以下内容添加到您喜欢的shell配置文件中,例如:export GOPATH=$HOME,然后在~/src/foo/blah/whatever.go中编写'foo/blah'包的代码。将GOPATH切换到pwd可能是有意义的,但可能仅适用于您现在所处的情况之外的其他情况。也就是说,在我看来,“pwd” hack不是一个好主意,特别是对于那些初学Go语言的人来说更是如此。 - zzzz
@jnml:我仍在学习语言和工具,但是按语言组织我的代码而不是按项目组织并不是我喜欢的工作方式。也许我应该改变习惯,我会看看的。 - Fred Foo
我在~/src下有各种不同的语言项目。子树路径可以是公共存储库路径(例如~/src/github.com/nick/prj-in-lang-x),对于公司项目,我使用例如~/src/gitlab.ourdomain.com/proj-in-lang-y,这本质上是相同的模式。这样,所有语言都和平地共存于我的磁盘上;-) - zzzz
我也喜欢按语言分离我的代码。我有一个目录~/Projects,其中包含子目录GoJavaC++Vala等。我只需将我的GOPATH环境变量设置为$HOME/Projects/Go,我的Go目录包含srcpkgbin子目录,就像在Go工作区中所期望的那样。这使我能够拥有一个固定的GOPATH,并按语言组织我的代码,而不需要使用pwd hack。 - weberc2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接