使用Nix构建Go项目报错:GO111MODULE=off导致模块被禁用
使用Nix构建Go项目时"modules disabled by GO111MODULE=off"错误的解决方法
问题场景
尝试用Nix构建Go项目,配置文件test3.nix内容如下:
buildGoPackage { name = "site"; goPackagePath = "git@github.com:username/rep.git"; src = fetchGit{ url = "git@github.com:username/rep.git"; }; }
执行构建命令:
nix build -f test3.nix
出现报错,错误日志最后8行:
unpacking sources
unpacking source archive /nix/store/l1gsllgg693s46sk7b7qiwbnjysnbbz6-source
source root is source
patching sources
configuring
building
Building subPackage git@github.com:user/rep.git
go: modules disabled by GO111MODULE=off; see 'go help modules'
解决方法
方法1:为buildGoPackage启用Go Modules
buildGoPackage默认关闭Go Modules,需显式开启并调整配置:
修改test3.nix为:
buildGoPackage { name = "site"; goPackagePath = "github.com/username/rep"; # 替换为Go模块的标准路径,不要用SSH格式 src = fetchGit{ url = "git@github.com:username/rep.git"; }; goDeps = ./deps.nix; # 需提前生成依赖描述文件 buildFlagsArray = [ "-mod=vendor" ]; # 项目用vendor目录时使用,否则可改为"-mod=readonly" GO111MODULE = "on"; # 强制开启Go Modules }
生成deps.nix的命令:
cd 项目源码目录 nix-shell -p goPackages.dep2nix --run "dep2nix > deps.nix"
方法2:改用buildGoModule(推荐)
buildGoPackage是旧工具,现代Go项目更适合用buildGoModule,它原生支持Go Modules,配置更简洁:
buildGoModule { pname = "site"; version = "0.1.0"; # 填写项目版本号 src = fetchGit{ url = "git@github.com:username/rep.git"; rev = "xxx"; # 可选,指定要构建的commit哈希 sha256 = "xxx"; # 首次运行nix build时会提示缺失,复制提示的哈希值填入即可 }; }
使用buildGoModule时,Nix会自动解析项目的go.mod和go.sum来处理依赖,无需手动生成deps.nix。
关键注意事项
goPackagePath必须是项目go.mod中定义的模块名(如github.com/username/rep),不能使用SSH格式的git@github.com:...,否则Go无法识别模块路径。- 如果项目使用
vendor目录,确保src包含该目录;使用buildGoModule时可通过vendorSha256指定校验值。
内容的提问来源于stack exchange,提问作者Sqler
相关产品推荐
相关产品推荐

