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”,如您所愿
  • (注释掉一些包含未使用变量的代码。)
  • 然后在meme/cmd/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.如果我使用fork
    github.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包。重要的