Import 从父目录相对导入
如何从父目录进行相对导入 从Import 从父目录相对导入,import,go,relative-path,Import,Go,Relative Path,如何从父目录进行相对导入 从meme/cmd/meme: import "../../../meme" 这会产生一个不明确的错误: matt@stanley:~/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/c
meme/cmd/meme
:
import "../../../meme"
这会产生一个不明确的错误:
matt@stanley:~/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
matt@stanley:~/gopath/src/bitbucket.org/anacrolix/meme/cmd/meme$ echo $GOPATH
/home/matt/gopath
如何从父目录本地导入?手动使用编译器、链接器等时,支持重新驱动导入。。。直接的。“go”(构建)工具不支持相同的功能(在某种程度上可与Java媲美)。编辑:相对导入路径不是go的方式。缺乏文档说明了相对路径的流行,我看不出使用它们的理由。Go推荐的代码组织工作得很好。每个包都应该有一个唯一的导入路径,并使用相同的导入路径在任何地方导入 查看如何使用类似于github.com/ha/doozerd/peer的包。这是Go项目中的常见做法,我已经见过很多次了。包(也在上;由Go的主要作者之一编写)通过完整路径导入
camlistore.org/pkg/netutil
即使您在同一个项目中同时拥有命令和库,这种方法仍然有效。在最初的问题中,您明智地询问了最佳实践。我尽了最大努力解释这方面的最佳做法
导入路径在Go中不能是相对的。我推荐阅读,这是组织围棋项目的基本阅读。下面是一个简短的概述: 为go开发创建一个类似于
~/go
的目录。然后说:
$ export GOPATH=~/go
$ mkdir $GOPATH/{src,bin,pkg}
$GOPATH/src
保存所有Go软件包的源代码,即使是使用Go get
下载的软件包bin
和pkg
保留编译的输出。包名为main
的包是命令,并生成可执行二进制文件,这些二进制文件将转到$GOPATH/bin
。其他包是库,它们编译的对象文件放在$GOPATH/pkg
中
现在,如果您将代码放入$GOPATH/src/matt/meme
,您可以通过导入“matt/meme”
导入它。建议为包名使用前缀,并为标准库保留较短的包名。这就是为什么我使用了$GOPATH/src/matt/meme
而不是$GOPATH/src/meme
围绕这个想法组织您的代码。谢谢您添加到您的问题中。首先是回答,然后是解释。我用
main.go中设置导入行
返回到“../../../meme”,如您所愿go run main.go
要么go build main.go
起作用go-build
本身不起作用;您必须键入go build main.go
。这是因为go命令不允许“非本地包中的本地导入”。您是对的,规范在这里没有什么帮助。它推敲出这样一句话:“ImportPath的解释依赖于实现。”当前的实现行为设置为,这随后变得疯狂
“本地”指文件系统相对路径。显然是一条以..开始的相对路径。。是本地的,所以技巧就是让
go
命令也将main作为本地包处理。显然,当你键入go build
时,它不会这样做,但当你键入go build main.go
时它会这样做。这可能无法回答最初的问题,但我在不需要的情况下尝试做上述操作,我所需要做的只是用替换临时更新go.mod
:
模块github.com/pselle/foo
替换github.com/pselle/bar=>/Users/pselle/Projects/bar
要求(
github.com/pselle/bar v1.0.0
)
参考:
我相信他们可以使用Mostafa,但它没有文档记录。相对路径适合于一个(IMO关键)用例:处理分叉存储库。如果你在github上转出某人的回购协议,你必须更新所有的import语句以引用你的副本,然后记住不要将它们推到上游(或者预期上游将在合并中排除它们)。虽然我知道这是组织go项目的“最佳实践”方式,但实际上它打破了通过github进行贡献的标准工作流。e、 g.如果我使用forkgithub.com/ha/doozerd/peer
,克隆我的fork(github.com/morphatic/doozerd/peer
),在相邻文件/文件夹中进行更改,然后尝试运行测试,我的更改不会被看到,因为import
语句引用了上游repo。有什么办法可以解决这个问题吗?我还没有测试过,但应该可以解决:不要在单独的目录中下载你的fork。将其作为远程文件添加到正确目录中的当前git repo。在推送到GitHub之前,如何创建新项目并使这些导入行工作?这里似乎存在一种循环依赖关系:您需要文件在GitHub上才能导入它们,但在测试之前不应该将文件放在GitHub上。我尝试了几种不同的方法,没有看到您提到的模糊错误。你的意思是你发现措辞模棱两可,还是短信中包含了模棱两可这个词。我尝试的两种方法是在GOPATH内使用meme/cmd/meme,然后在GOPATH外使用。在这两种情况下,相对导入路径对我来说都很好。你能提供更多关于什么对你不起作用的细节吗?@Sonia你试过go工具吗?我会补充更多细节。是的。我假设您在meme中有一个包,在meme/cmd/meme中有一个可执行文件。对于GOPATH,在刚刚工作的可执行文件上运行或安装。对于GOPATH之外的情况,我使用go tool 6g和go tool pack编译了meme包。重要的