go mod download报permission denied是nfs下flock锁失效导致的并发写入冲突,非目录权限问题;应为每个用户显式设置本地gocache路径(如/tmp/$user/go-cache)并确保属主明确、可写。

go mod download 报 Permission denied 是文件锁冲突,不是权限错
多用户共用 NFS 挂载的 $HOME 时,go mod download 频繁报 Permission denied 或 cannot lock cache directory,根本原因不是目录没写权限,而是多个进程同时尝试在 $GOCACHE 下创建/持有 cache.lock 文件——NFS 对 flock() 支持弱,锁机制失效,导致并发写入被内核拒绝。
- 默认
$GOCACHE是$HOME/.cache/go-build,NFS 共享后所有用户实际指向同一物理路径 -
go env -w GOCACHE=...不推荐:它写入$HOME/go/env,该文件会被su切换用户继承,污染其他用户环境 - 正确做法是每个用户在
~/.bashrc中显式export GOCACHE,且路径必须本地磁盘(避开 NFS)
例如:
export GOCACHE=/tmp/$USER/go-cache mkdir -p /tmp/$USER/go-cache && chmod 700 /tmp/$USER/go-cache
GOBIN 写入失败常因路径 fallback 到只读位置
go install 提示 cannot write to $GOBIN,多数情况是 $GOBIN 未显式设置,导致 Go fallback 到 $GOPATH/bin,而 $GOPATH 被设为全局只读路径(如 /opt/gopath)或 NFS 同步目录但属主/权限不一致。
Go 配置库,使用 spf13/viper — 分层优先级(flag > env >file > KV > default),提供 BindPFlag/BindPFlags、SetEnvPrefix + SetEnvKeyReplace 等功能。
-
go install默认写入$GOBIN;若未设,则用$GOPATH/bin;若$GOPATH也未设,才 fallback 到$HOME/go/bin -
go env -w GOBIN=...优先级高于 shellexport,调试时容易掩盖真实路径,建议统一用export - 确保目标目录存在且可写:
mkdir -p $HOME/bin && chmod 755 $HOME/bin,再export GOBIN=$HOME/bin
GOPROXY 和 GOPRIVATE 必须配对,否则私有模块 403
依赖下载卡住、报 403 或 unknown revision,大概率是 GOPRIVATE 没覆盖私有域名。Go 默认仍会把私有仓库请求发往 GOPROXY,而镜像站无权限访问内网 Git,直接返回 403。
-
GOPRIVATE必须包含完整域名,支持通配符:go env -w GOPRIVATE="git.internal.company.com,github.com/my-org/*" - 多个域名用英文逗号分隔,**不能有空格**;通配符仅作用于子域名层级,
github.com/my-org/*不匹配github.com/my-org/sub-repo的嵌套路径 - 临时验证是否生效:
GOPROXY=direct go mod download -v,看私有模块 URL 是否直连而非走代理
离线环境必须关 GOSUMDB,只关 GOPROXY 不够
局域网内执行 go mod download 报 dial tcp: i/o timeout,常见于只设了 GOPROXY=off 却漏掉 GOSUMDB=off。Go 仍会尝试连接 sum.golang.org 校验 checksum,而该地址在离线环境必然失败。
- 两个开关必须同时关闭:
go env -w GOPROXY=off且go env -w GOSUMDB=off - 验证:
go env GOPROXY GOSUMDB应输出off off - 离线缓存需提前在有网机器上完整生成:
go mod download后打包整个$(go env GOMODCACHE)目录,解压到离线机相同路径
真正麻烦的是缓存路径一致性——go env GOPATH 在两台机器上必须完全一致,否则 Go 找不到已下载的模块。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










