GO111MODULE=on 必须设置在项目含 go.mod、位于 $GOPATH 外、依赖私有仓库或需锁定 go.sum 时;auto 易误判,off 彻底退化为 GOPATH 模式,仅限极少数遗留场景。
GO111MODULE=on 什么时候必须设
Go 1.11 引入 Modules 后,
决定是否启用模块感知模式。不是“推荐开启”,而是“不设就可能出错”——尤其当你在
外写代码、依赖非标准仓库(如私有 Git)、或需要锁定
时。
看似省事,但它只在当前目录外有
或不在
时才启用模块,容易误判。
常见错误现象:
报
,但明明
里写了依赖;或者
拉的是
最新版而非
锁定的版本。
是最安全的默认值,强制所有操作走模块逻辑,无视
结构
CI/CD 环境中务必显式设置,避免因基础镜像
默认为
导致构建不一致
Windows 用户注意:PowerShell 中用
,CMD 中用
,别漏掉引号
GO111MODULE=off 仅适用于老项目迁移过渡
设成
就彻底退回到 GOPATH 模式:所有
命令忽略
,不生成
,
直接写入
。这不是“兼容旧习惯”,而是主动放弃模块特性。
使用场景极少:比如你正在维护一个 Go 1.9 项目,团队尚未统一升级工具链,且暂时不打算引入版本控制语义;或者调试某个严重依赖
路径硬编码的遗留脚本。
一旦项目已有
,再设
会导致
报错
在
模式下直接不可用,命令不存在
某些 IDE(如 VS Code 的 Go 扩展)会静默忽略
,补全和跳转按 GOPATH 路径解析,造成开发体验割裂
GO111MODULE=auto 的坑:$GOPATH/src 下的假模块
是 Go 1.16 之前的默认值,现在仍被很多文档沿用,但它在边界 case 下行为模糊。最典型的是:你在
目录下执行
,生成了
,但后续
仍可能走 GOPATH 模式——因为
发现你在
里,就认为“这是老式布局”,不启用模块。
PHP基础-环境变量函数等
PHP基础-环境变量函数等
vip-kj-zhu/php-kj/4-jQuery-最流行的JS函数库.zip
下载
这导致依赖不走
、
不生效、
不更新,甚至
和
行为不一致(前者可能绕过模块检查)。
验证是否真启用了模块:运行
,输出应为当前目录下的
绝对路径,而不是空或
不存在提示
在
模式下可能返回
而非模块名,说明模块未激活
不要依赖文档说“auto 就够了”,只要项目根目录有
,就该设
go mod init 后 GO111MODULE 状态必须匹配
只是生成文件,不改变
环境变量
。如果此时
,那
就是废文件;如果
但没配
,又可能因私有域名解析失败卡住。
实操建议:初始化后立刻验证模块是否真正接管构建流程。
执行
,观察输出里是否有
这类模块解析日志;若只有
路径打印,说明还在 GOPATH 模式
检查
是否随
自动更新;没更新?大概率
没生效
跨平台协作时,把
加进项目根目录的
(配合 direnv)或 CI 脚本,比靠人记更可靠
模块不是开关,而是 Go 工具链的一层约束系统。环境变量设错,整个依赖解析链条就脱钩——这点比
校验失败还难排查,因为错误往往静默发生。
GO111MODULE$GOPATHgo.sumGO111MODULE=autogo.mod$GOPATHgo buildcannot find module providing package xxxgo.modgo getmastergo.modGO111MODULE=on$GOPATHGO111MODULEauto$env:GO111MODULE="on"set GO111MODULE=onoffgogo.modgo.sumgo get$GOPATH/src$GOPATHgo.modGO111MODULE=offgo list -m allnot using modulesgo mod vendoroffgo.modauto$GOPATH/src/example.com/foogo mod initgo.modgo buildauto$GOPATH/srcreplaceexcludego.sumgo run main.gogo buildgo env GOMODgo.modgo.modgo list -mautocommand-line-argumentsgo.modongo mod initGO111MODULE=offgo.modGO111MODULE=onGOPROXYgo build -vfinding example.com/bar@v1.2.3github.com/user/pkggo.sumgo getGO111MODULEexport GO111MODULE=on.envgo.sum