2012-05-21 49 views
32

如何从父目录进行相对导入?从父目录进行相对导入

meme/cmd/meme

import "../../../meme" 

这给出了一个明确的错误:

[email protected]:~/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme$ go get bitbucket.org/anacrolix/meme/cmd/meme 

can't load package: /home/matt/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme/main.go:8:2: local import "../../../meme" in non-local package 

[email protected]:~/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme$ echo $GOPATH 

/home/matt/gopath 

如何在本地从父目录导入?

+0

我尝试了几种不同的方法,但没有看到您提到的模糊错误。你的意思是你发现这个词语含糊不清,或者那个消息文本中包含了含糊不清的单词。我尝试过的两种方法是在GOPATH中meme/cmd/meme,然后在GOPATH之外。在这两种情况下,相对的进口路径对我来说都很好。你能提供更多关于什么不适合你的细节吗? – Sonia

+0

@Sonia您是否尝试使用go工具?我会添加更多细节。 –

+0

是的。我认为你有一个meme包和一个可执行文件meme/cmd/meme。对于GOPATH的情况,运行或去安装可执行文件刚刚工作。对于GOPATH以外的情况,我使用go tool 6g编译了meme包并转到工具包。主包中的导入只需要../../meme指向.a,否则就去工具6g,然后去工具6l构建一个访问包的可执行程序。 – Sonia

回答

16

感谢您添加到您的问题。首先是答案,然后是一些解释。我建立你的代码,

  1. 去得到,就像你有。 (我忽略了错误信息。)
  2. 将导入行设置为main.go回到“../../../meme”,就像你想要的那样。
  3. (注释出的包含未用的可变码一点点。)
  4. 然后在模因/ CMD /模因目录,无论是go run main.gogo build main.go工作。

我刚才在评论中写错了,当时我说去安装工程;我应该说,去建设。

但是关键是go build单独不起作用;您必须输入go build main.go。这是因为go命令不允许“非本地包中的本地导入”。你说得对,规范在这里没有什么帮助。它狡猾地说:“ImportPath的解释是依赖于实现的。”目前的实施行为是使用CL 5787055进行设置的,后续步骤为debated at length

“本地”是指文件系统相对路径。显然,以..开头的相对路径是本地的,所以诀窍就是让go命令将main作为本地包。当你键入go build时,它显然不会这样做,但是当你输入go build main.go

2

Relarive进口时使用手动编译器,链接,...直接支持。 '去'(构建)工具不支持相同的(不知何故与Java相比)。

+1

虽然可能。请提及这是一项令人沮丧的行为。 – mvrak

41

编辑:相对进口路径不是围棋的路要走。缺乏文档显示了相对路径的流行性,我没有看到使用它们的原因。 Go推荐的代码组织工作得很好。每个软件包都应该有一个独特的导入路径,并使用相同的导入路径导入无处不在

查看如何一包像github.com/ha/doozerd/peerimports its neighbors。这是Go项目中的常见做法,我已经看过很多次了。包camlistore.org/pkg/auth(也在GitHub;由Go的主要作者之一编写)通过完整路径导入camlistore.org/pkg/netutil

即使你是在同一个项目,这个方法工作同时具有命令和库。在您最初的问题中,您明智地要求采取最佳做法。我尽力解释有关此问题的最佳做法。


导入路径在Go中不能相对。我推荐阅读How to Write Go Code,这是组织Go项目的基本阅读材料。这里有一个简短的概述:

作出这样~/go一个目录,在围棋的发展。然后说:

$ export GOPATH=~/go 
$ mkdir $GOPATH/{src,bin,pkg} 

$GOPATH/src适用于所有进入包的源代码,就算对方不是你的下载与go getbinpkg保留汇编的输出。包名为main的软件包是命令并产生可执行的二进制文件,其格式为$GOPATH/bin。其他软件包是库,它们的编译目标文件放在$GOPATH/pkg中。

现在,如果您将代码放入$GOPATH/src/matt/meme,则可以通过import "matt/meme"将其导入。建议为包名称使用前缀,并为标准库留下简短的包名称。这就是为什么我用$GOPATH/src/matt/meme而不是$GOPATH/src/meme

围绕此想法组织您的代码。

+1

我相信他们可以Mostafa,但它没有证件。 –

+0

@MattJoiner你是对的。我不知道他们可以使用Go工具。但无论如何,我认为我们不应该使用它们。必须更新我的答案。 – Mostafa

+11

相对路径适用于一个(IMO关键)用例:处理分叉库。如果您在github上分发某人的回购,您必须更新所有导入语句以引用您的副本,然后记住不要推送那些上游(或期望上游会在合并中排除它们)。只是变得sl。。 – 2013-09-09 19:07:57