
Go 1.5+ 默认启用 vendor 机制,但仅当项目位于 GOPATH/src 的子目录下(如 src/myapp/)时才生效;若直接将代码放在 GOPATH/src/ 根目录,Go 会忽略 vendor 目录并报“package not found”错误。
go 1.5+ 默认启用 vendor 机制,但仅当项目位于 gopath/src 的**子目录下**(如 src/myapp/)时才生效;若直接将代码放在 gopath/src/ 根目录,go 会忽略 vendor 目录并报“package not found”错误。
在 Go 模块(Go Modules)成为默认方案之前,vendor/ 目录是 Go 1.5 引入的依赖隔离机制,其生效有明确的前提条件:项目必须位于 $GOPATH/src/ 下的某个子路径中,且该路径需构成合法的 import path(即不能是 src/ 本身)。
你当前的项目结构为:
C:\Users\js\dev\my_project\rest\src\ ← 这里是 $GOPATH/src/ ├── main.go └── vendor/
此时 go run main.go 执行时,Go 工具链会将当前目录($GOPATH/src/)视为“无 import path 的根”,因此跳过 vendor 查找逻辑,直接按 GOPATH/GOROOT 搜索依赖——这正是错误信息中列出的三条路径来源。
✅ 正确做法是将项目移至 $GOPATH/src/ 的子目录,例如:
# 假设 GOPATH=C:\Users\js\dev\my_project\rest;c:\Users\js\dev\go # 创建规范路径(import path = "myproject/rest") mkdir -p C:\Users\js\dev\my_project\rest\src\myproject\rest # 将 main.go 和 vendor/ 移入该目录 move C:\Users\js\dev\my_project\rest\src\main.go C:\Users\js\dev\my_project\rest\src\myproject\rest\ move C:\Users\js\dev\my_project\rest\src\vendor C:\Users\js\dev\my_project\rest\src\myproject\rest\
然后在 src/myproject/rest/ 目录下执行:
cd C:\Users\js\dev\my_project\rest\src\myproject\rest go run main.go
此时 Go 能识别 myproject/rest 为有效 import path,并自动启用 vendor 机制:优先从 ./vendor/gopkg.in/alecthomas/kingpin.v2 加载依赖。
⚠️ 注意事项:
- 不要将项目代码直接放在 $GOPATH/src/ 根目录(即 src/ 文件夹内无包名子目录),这是 vendor 失效的最常见原因;
- 确保 vendor/ 目录与 main.go(或 go.mod)处于同一级目录;
- Go 1.7(你当前版本)已支持 vendor,无需额外启用标志;
- 若后续升级至 Go 1.11+,建议迁移到 Go Modules(go mod init + go mod vendor),它不依赖 GOPATH,且 vendor 行为更稳定、可重现。
总结:vendor 机制不是“只要存在 vendor/ 目录就自动生效”,而是严格绑定于 Go 的 import path 解析规则。遵循 GOPATH/src/{import-path}/ 的经典布局,是保障 vendor 正常工作的基础前提。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











