golang的 GOPATH和vendor的搜索关系

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了golang的 GOPATH和vendor的搜索关系相关的知识,希望对你有一定的参考价值。

参考技术A golang的 GOPATH和vendor的搜索关系

项目只有一个包,即main包,没有引用其他的包(golang自带的系统包除外)。

然后设置GOPATH=path/to/<goproject>,再运行go build myproject,这样就可以在任何目录下面编译,编译生成的可执行文件就在编译所在的目录下,而不是包源文件所在的目录。

基本规则:

鉴于此,建议golang项目必须严格按照规范的目录结构组织,哪怕是前面这种自包含的项目。

基本规则:

如果一个包在vendor和GOPATH下面都存在那么谁会优先使用呢。
结论是:

包mydeps在vendor目录下面和GOPATH路径下面都存在了,那么main.go引用的时候只会引用vendor下面的mydeps(src/myproject/vendor/mydeps),而忽略GOPATH下面的mydeps包(src/mydeps)。

前面提到GOPATH和PATH类似,可以包含多个路径,中间用分号隔开,go在搜索包的时候会按手续从前往后搜搜。那么vendor怎么处理层级关系呢。

规则是:

举例:

如果src/mydep/mydep1/mydep.go引用了myvendor1和myvendor,那是怎么搜索的呢

go1.6的vendor不生效原因

用go1.6时,把自己写的包放在vendor目录里,发现go编译时并不去找vendor目录里的包,在各种google之后也没找到原因。仔细观察官方的示例才发现,使用vendor功能时包都在$GOPATH/src下,测试了一下,果然是这样。只有在$GOPATH/src下的包,才能使用vendor目录存放依赖包。

现在go对不在$GOPATH/src下开发的项目限制越来越多,看来以后只能在$GOPATH/src下新创建项目了。

以上是关于golang的 GOPATH和vendor的搜索关系的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu16.04下安装golang

Golang Module快速入门

golang笔记——包

go1.6的vendor不生效原因

golang vendor

go官方包依赖管理工具之mod