本文详解 gopath 正确结构与外部包引用方式,解决因目录布局错误导致的“cannot find package”编译失败问题,适用于 google app engine(go 1.11 前旧版 `goapp` 工具链)及标准 go 项目。
在 Go 开发中,尤其是使用旧版 Google App Engine SDK(goapp)时,cannot find package "xxx" 错误几乎总是源于 GOPATH 目录结构不合规,而非代码本身问题。你当前将 GOPATH 设为 MyApp/src 是根本性错误——GOPATH 必须指向一个包含 src/、pkg/、bin/ 三级子目录的根路径,而非直接指向 src/。
✅ 正确的 GOPATH 结构应如下:
$GOPATH/ ├── src/ # 所有源码存放处(含第三方包 + 自己的项目) │ ├── code.google.com/p/google-api-go-client/ # go get 自动创建 │ ├── github.com/fluffle/goirc/ │ └── mycompany.com/myapp/ # 你的应用主目录(推荐独立于第三方路径) ├── pkg/ # 编译生成的包对象(无需手动管理) └── bin/ # go install 生成的可执行文件
⚠️ 关键规则:
? 实操步骤(以你的 Drive API 需求为例):
重设 GOPATH(假设项目根目录为 ~/MyApp):
export GOPATH="$HOME/MyApp" # 注意:这是 MyApp 根目录,不是 MyApp/src! mkdir -p "$GOPATH/src" "$GOPATH/pkg" "$GOPATH/bin"
获取依赖包:
go get code.google.com/p/google-api-go-client/drive/v2 go get code.google.com/p/google-api-go-client/googleapi
执行后检查:ls $GOPATH/src/code.google.com/p/google-api-go-cli
ent/ 应看到 drive/、googleapi/ 等子目录。
重构项目结构:
~/MyApp/ ├── src/ │ ├── code.google.com/p/google-api-go-client/ # 由 go get 自动生成 │ └── myapp/ # 你的应用代码放这里! │ ├── app.yaml │ └── main.go ├── pkg/ └── bin/
在 main.go 中正确导入:
package main
// +build !appengine
import (
"code.google.com/p/google-api-go-client/drive/v2"
"code.google.com/p/google-api-go-client/googleapi"
)
func main() {
// 使用示例
srv, _ := drive.New(&http.Client{})
// ...
}? 补充说明:
总结:GOPATH 不是源码目录,而是工作区根目录;go get 是包安装工具,不是“下载到当前目录”的命令。 严格遵循 GOPATH/src/