Golang如何导入没有gopath的本地软件包?

我已经使用GOPATH但目前这个问题我没有帮助。 我希望能够创build特定于项目的包:

 myproject/ ├── binary1.go ├── binary2.go ├── package1.go └── package2.go 

我尝试了多种方式,但是如何让package1.go工作在binary1.go或者binary2.go等等?

例如; 我想能够import "package1" ,然后能够运行go build binary1.go ,一切工作正常,没有错误被抛出的包不能在GOROOTGOPATHfind。 我需要这种function的原因是大型项目。 我不想引用多个其他软件包或将它们保存在一个大文件中。

虽然我的老方法工作,它不再是“正确”的方式来做到这一点。 您应该使用Go 1.6中默认启用的供应商function; 看 。 您基本上在vendor目录中添加您的“外部”或“依赖”包; 编译后编译器将首先使用这些包。


发现。 我可以用GOPATH导入本地包, GOPATH是创buildpackage1的子文件夹,然后用binary1.gobinary2.go脚本中的import "./package1"导入,如下所示:

binary1.go

 ... import ( "./package1" ) ... 

所以我目前的目录结构如下所示:

 myproject/ ├── binary1.go ├── binary2.go ├── package1/ │ └── package1.go └── package2.go 

我也应该注意到,相对path(至less在1.5)也是有效的。 例如:

 import "../packageX" 

没有“本地包装”这样的东西。 磁盘上软件包的组织与任何软件包的父/子关系是正交的。 由包形成的唯一真正的层次结构是依赖关系树,在一般情况下它不反映目录树。

只是使用

 import "myproject/packageN" 

不要因为没有理由而打架系统。 在任何非平凡的程序中每次导入保存十几个字符不是一个好的理由,因为例如具有相对导入path的项目是不可获取的。

导入path的概念有一些重要的属性:

  • 导入path可以是全球唯一的。
  • 结合GOPATH,导入path可以毫不含糊地转换为目录path。
  • GOPATH下的任何目录path都可以毫不含糊地转换为导入path。

以上所有都是通过使用相对导入path来破坏的。 不要做。

PS:在Go编译器testing中遗留代码中使用相对导入的地方很less。 自动柜员机,这是为什么支持相对import的唯一原因。

也许你正试图模块化你的软件包。 我假设package1package2在某种程度上是同一个软件包的一部分,但为了便于阅读,您将它们分成了多个文件。

如果以前的情况是你的,你可以使用相同的软件包名称到这些倍数文件,这将是如果有相同的文件。

这是一个例子:

add.go

 package math func add(n1, n2 int) int { return n1 + n2 } 

subtract.go

 package math func subtract(n1, n2 int) int { return n1 - n2 } 

donothing.go

 package math func donothing(n1, n2 int) int { s := add(n1, n2) s = subtract(n1, n2) return s } 

我不是一个专家,这是我在StackOveflow的第一篇文章,所以如果你有一些build议,它会很好的收到。

要将“本地”包添加到项目中,请添加一个文件夹(例如“package_name”)。 并把你的实现文件在该文件夹中。

 src/github.com/GithubUser/myproject/ ├── main.go └───package_name └── whatever_name1.go └── whatever_name2.go 

在你的package main做到这一点:

 import "github.com/GithubUser/myproject/package_name" 

其中package_name是文件夹名称,它必须与文件whatever_name1.go和whatever_name2.go中使用的软件包名称匹配。 换句话说,所有带有子目录的文件应该是相同的包。

只要您在导入中指定到父文件夹的整个path,就可以进一步嵌套更多子目录。

如果您使用的是OS X或Linux等* nix操作系统,则可以使用符号链接来实现两个世界的最佳效果,即使用真正的$ GOPATH也go get库,而且项目结构不必以$ GOPATH。

 ln -s ~/path/to/myproject/ $GOPATH/src/myproject 

然后,您可以通过执行以下操作轻松导入您的库:

 import "myproject/mylib" 

当然,如果你的项目变得更大了,你有很多其他的开发者修改代码,或者你公开发布你的代码等等,那么这个开始就会崩溃。但是对于小型的单开发者项目,这个项目可以替代:

  1. 不得不推到公共import "github.com/user/myprojcet/mylib"import "github.com/user/myprojcet/mylib"到处
  2. 不得不经常与你的$ GOPATH monkey </s>