golang vendor路径问题

请教一下,在gopath(这里和下面提及的gopath都是包含src目录了)下面创建a.go和vendor目录, ``` cat a.go package main import( "fmt" "wer" ) func main(){ fmt.Println(wer.Echo()) } ``` ``` cat vendor/wer/s.go package wer func Echo() int{ return 123 } ``` 为什么在a.go里会提示找不到这个包,但是在同级目录,可以找到github.com等其他的包 在GOPATH下新建一层目录test,把a.go和vendor都cp到test 在test下go build就完全没问题,即使吧test目录下的vendor删掉,也会自动的找到上一层目录(GOPATH)下的vendor 同属于GOPATH,为什么第二种情况就能找到vendor,第一种情况找不到,真是奇了个怪。。。
已邀请:

astaxie - 创造、获取、分享、传播和应用Go

赞同来自: viktor1992 AriesDevil silentred xieyanke haoc7 pytimer更多 »

刚和 @viktor1992 看了一下源码,看到这个vendor的函数

```
// vendoredImportPath returns the expansion of path when it appears in parent.
// If parent is x/y/z, then path might expand to x/y/z/vendor/path, x/y/vendor/path,
// x/vendor/path, vendor/path, or else stay path if none of those exist.
// vendoredImportPath returns the expanded path or, if no expansion is found, the original.
func vendoredImportPath(parent *Package, path string) (found string) {
if parent == nil || parent.Root == "" {
return path
}
```

这个里面有一个概念parent,我们可以看到Go官方关于vendor的文档设计的时候都有这个,也就是说你的源码要有一个包存起来,我们看一下这个实验里面的代码。

首先`a.go`放在了gopath低目录,也就是他的parent是nil,所以这个返回了`wer`,而这个包又不在gopath下面,所以第一个报错了。

第二个你创建了test目录,那么他的parent就是test,那么就会去找test/vendor/path和vendor/path下面找,所以vendor不管你放在test下面还是gopath下面都是可以找到的。
补充一下,go版本,1.7
go version
go version go1.7 darwin/amd64
顺便问一下,如果不放在src目录里面,直接放在GOPATH目录下会怎样?
github上有对vendor的明确解释,vendor的目录必须是所在项目的包内,不能允许为non-package的目录,也就是说vendor的目录路径应该位于GOPATH下的包内,这是对vendor顶层目录路径的要求

要回复问题请先登录注册