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
,一切工作正常,没有错误被抛出的包不能在GOROOT
或GOPATH
find。 我需要这种function的原因是大型项目。 我不想引用多个其他软件包或将它们保存在一个大文件中。
虽然我的老方法工作,它不再是“正确”的方式来做到这一点。 您应该使用Go 1.6中默认启用的供应商function; 看 。 您基本上在vendor
目录中添加您的“外部”或“依赖”包; 编译后编译器将首先使用这些包。
发现。 我可以用GOPATH
导入本地包, GOPATH
是创buildpackage1
的子文件夹,然后用binary1.go
和binary2.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的唯一原因。
也许你正试图模块化你的软件包。 我假设package1
和package2
在某种程度上是同一个软件包的一部分,但为了便于阅读,您将它们分成了多个文件。
如果以前的情况是你的,你可以使用相同的软件包名称到这些倍数文件,这将是如果有相同的文件。
这是一个例子:
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"
当然,如果你的项目变得更大了,你有很多其他的开发者修改代码,或者你公开发布你的代码等等,那么这个开始就会崩溃。但是对于小型的单开发者项目,这个项目可以替代:
- 不得不推到公共
import "github.com/user/myprojcet/mylib"
并import "github.com/user/myprojcet/mylib"
到处 - 不得不经常与你的$ GOPATH monkey </s>