drone默认不自动启用go modules,必须显式设置go111module=on并确保项目根目录存在已提交的go.mod文件,否则依赖拉取失败、构建报错;需在.drone.yml中前置go mod download并避免gopath干扰。

Drone 默认不自动启用 Go Modules,拉取依赖失败通常是因为 GO111MODULE 环境变量未设或 GOPATH 干扰导致。必须显式开启模块模式,否则 go build 或 go test 会退回到旧的 GOPATH 模式,找不到 go.mod 里的依赖。
确认项目根目录存在 go.mod
Drone 不会帮你初始化模块 —— 它只执行你写的命令。如果你的仓库里没有 go.mod,go mod download 或 go build 就会报错 no go files in current directory 或 cannot find module providing package。
- 本地开发时务必在项目根目录运行
go mod init github.com/yourname/yourrepo -
go.mod必须提交到 Git,Drone 拉代码后才看得到 - 如果项目用了子模块或 vendor 目录,也要一并提交(但推荐不用 vendor,让 Drone 在构建时动态拉取)
在 .drone.yml 中显式启用 Go Modules
Drone 的默认 Golang 镜像(如 golang:1.21)在较新版本中已默认开启模块模式,但某些基础镜像或自定义镜像仍可能关闭。最稳妥的方式是手动设置环境变量。
- 在
pipeline步骤中加environment块:build:<br> image: golang:1.21<br> environment:<br> GO111MODULE: on<br> commands:<br> - go mod download<br> - go build -o app .
- 不建议依赖
GO111MODULE=auto,它在非 GOPATH 路径下才生效,而 Drone 的工作目录由workspace.path控制,容易误判 - 如果用了
go run或go test,同样需要前置go mod download,否则首次执行会卡住或超时
避免 GOPATH 干扰和缓存污染
Drone 的构建容器是干净的,但如果你在 commands 中反复执行 go get 或手动改写 go.mod,可能触发校验失败或依赖不一致。
- 不要在 pipeline 里运行
go get -u—— 它会修改go.mod和go.sum,而这些文件应由开发者提交,不是 CI 自动生成 - 若需私有模块(如公司内网 Git),得配置
go env -w GOPRIVATE=git.example.com/*,否则go mod download会尝试走 proxy 并失败 - Drone 默认不缓存
$GOPATH/pkg/mod,每次构建都重新拉依赖;如需加速,可挂载 volume 或用cache插件(但要注意 checksum 校验一致性)
真正容易被忽略的是:Drone 执行 go mod download 时,不会报错但 silently 跳过缺失依赖,直到 go build 阶段才爆出 import not found —— 所以务必把 go mod download 放在构建命令最前面,并检查它的输出日志是否有 verifying 或 sum mismatch 提示。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!











