Golang意外的目录结构

9

我从github.com/minio/minio下载了minio。

我想从源代码运行它,

我创建了如下目录:

~/Downloads/minio-RELEASE.2017-06-13T19-01-01Z
|
 src
   |
    all minio directories, including vendor, like the image below

在这里输入图片描述

我还使用godep来解决GOPATH下的其他依赖关系。

现在我从Gogland(go IDE)运行它

它显示:

GOROOT=/usr/local/Cellar/go/1.8.3/libexec
GOPATH=/Users/xl/Downloads/minio-RELEASE.2017-06-13T19-01-01Z:/Users/xl/go
/usr/local/Cellar/go/1.8.3/libexec/bin/go build -i -o /private/var/folders/8v/6dg7d6mx2850sv1gp8ts9thm0000gn/T/go_run_main_gogo /Users/xl/Downloads/minio-RELEASE.2017-06-13T19-01-01Z/src/main.go
unexpected directory layout:
    import path: github.com/Azure/azure-sdk-for-go/storage
    root: /Users/xl/Downloads/minio-RELEASE.2017-06-13T19-01-01Z/src
    dir: /Users/xl/Downloads/minio-RELEASE.2017-06-13T19-01-01Z/src/vendor/github.com/Azure/azure-sdk-for-go/storage
    expand root: /Users/xl/Downloads/minio-RELEASE.2017-06-13T19-01-01Z/src
    expand dir: /Users/xl/Downloads/minio-RELEASE.2017-06-13T19-01-01Z/src/vendor/github.com/Azure/azure-sdk-for-go/storage
    separator: /

现在我很困惑,到底出了什么问题?文件都在那里,目录也和打印出来的一样。我该怎么解决呢?谢谢。

6个回答

26
在升级从1.11到1.13版本后,我在所有代码中遇到了问题。似乎Golang 1.13不再支持"./something"这样的导入方式,因此我必须将其改为"myapp/something"才能继续开发。

补充说明:现在最好的方法是使用模块。使用go mod init从您的代码创建一个模块,然后将对您的目录的引用插入为“replace”指令。有关更多信息,请参见https://blog.golang.org/using-go-modules。 - Philippe Thomassigny

8
请查看GitHub代码布局

$GOPATH是该项目的根目录 - 您的每个Github仓库都将在$GOPATH下面的多个文件夹中检出。
您的$GOPATH变量将指向您的Go工作区的根目录,如How to Write Go Code中所述。

在您的情况下,在GOPATH文件夹下面,您应该有:

src/github.com/minio/minio

仅当“所有minio目录,包括vendor”时才能执行操作。


谢谢您的回复。但是我刚接触Go语言,还不清楚如何解决它。您说我应该有src/github.com/minio/minio,但是我拥有的Minio是直接的源代码,而不是通过go get下载的。 - Wingzero
1
@Wingzero 创建 GOPATH/src/github.com/minio 文件夹,然后在其中克隆您的仓库:这将为您提供 GOPATH/src/github.com/minio/minio,然后 go build 就可以工作了。或者,只需尝试 go get github.com/minio/minio:这应该做同样的事情(克隆 + 构建)。 - VonC
太棒了,它正在运行。非常感谢!遗憾的是,Gogland仍然无法在我的断点处进行调试。不管怎样。 - Wingzero
如果您告诉我在哪里设置断点,我会在此处 https://youtrack.jetbrains.com/issues/Go 跟进问题,并希望解决它。 - dlsniper

6
这可能是因为您在`goroot`和`gopath`下有重复的代码库。请删除`goroot`中的重复代码库。

3

我注意到在使用go1.13及其以上版本时(并且使用go mod),如果我将我的项目从$GOPATH目录下移出,就可以使用import "./mypackage"语句。但是,在$GOPATH目录下的同一个项目将不能成功构建,这与上述原始问题提供的错误信息相符。我不想放弃$GOPATH环境变量,但如果可能的话,我喜欢将小型包保存在项目本地,而不必在不需要时提交go.mod文件。


1
如果你的项目文件夹在$GOPATH目录下,那么你应该在导入包时不使用"./package"。只有当你的项目文件在$GOPATH之外时,才能使用"./package"名称导入包。

0

我在意识到由于项目位置的原因,无法正确导入本地包后遇到了这个问题。我的项目不在GOPATH位置,所以我将我的项目移动到那里。在移动之前,我通过./package name导入包,移动到GOPATH后,我通过projectname/packagename正确导入包。

所以我做的是以正确的方式导入包"projectname/packagename",因此我将我的导入"./packagename"更正为""projectname/packagename。希望这不会太令人困惑。似乎这个错误可能出现在不同的情况下。


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