在go mod 模式下,如果项目根目录下存在vendor目录,则使用go build编译时会默认到vendor目录下查找所有依赖的包,即使删除vendor下其他包以及执行go mod vendor 时在vendor.txt目录下生成的modules.txt文件的包信息,依然是无法成功执行go build。windows10下go1.13版本和go1.16版亲测是无法构建成功的,会抛出类似 github.com/astaxie/beego@v1.12.3: is explicitly required in go.mod, but not marked as explicit in vendor/modules.txt 这种异常。
go mod vendor的推荐用法是生成vendor目录后,在执行go build 时指定参数 -mod=vendor来使用vendor中的包,从而在某些网络不通的环境下可以避免走网络代理去拉包。
而且即使两种方式可以共存也不建议这样做,多种包管理方式共存会导致包管理混乱还可能导致版本兼容问题。
对于一些第三方包,为了防止其删除了指定版本导致引用这些包的项目不稳定的问题,建议搭建内部的goproxy服务,所有用到的包缓存一份到内部的goproxy服务。
或者将这些包git clone 下来放到项目指定目录,使用go mod replace的方式导入本地路径的中包