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

刚和 @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下面都是可以找到的。

viktor1992

赞同来自:

补充一下,go版本,1.7
go version
go version go1.7 darwin/amd64

passinger

赞同来自:

顺便问一下,如果不放在src目录里面,直接放在GOPATH目录下会怎样?

要回复问题请先登录注册