问题描述
如题,项目开发中遇到如下报错(你的报错信息可能与我的有一点区别,如verifying的包名,但是问题本质都是一样的):
verifying github.com/algorand/go-codec/codec@v1.1.8/go.mod: checksum mismatch
downloaded: h1:YkEx5nmr/zuCeaDYOIhlDg92Lxju8tj2d2NrYqP7g7k=
go.sum: h1:tQ3zAJ6ijTps6V+wp8KsGDnPC2uhHVC7ANyrtkIY0bA=
SECURITY ERROR
This download does NOT match an earlier download recorded in go.sum.
The bits may have been replaced on the origin server, or an attacker may
have intercepted the download attempt.
For more information, see 'go help module-auth'.
问题原因
- 项目开发时使用go mod进行包管理,而go mod对使用的包有缓存的机制,并且会针对使用的包进行checksum校验,方便区分不同的包版本
- go mod管理包的时候,下载源可以自行设置(goproxy),国内开发者对于github上的一些包因为墙的原因,下载速度较慢,多数会采用第三方提供的代理地址进行下载,而每个人使用第三方的代理地址又不一样,第三方的下载的代码源也可能不同
- 综上,如果项目组中每个人使用的goproxy不一样,容易出现这个问题,或者只有你自己配置的一开始和其他人不一样,即使后续修改成一样的,这个时候还是会出现这个问题。
解决方法
- 如果你的goproxy配置和别人不一样(别人没有这个问题的时候),你需要先修改自己的goproxy和其他人保持一致:
go env -w GOPROXY="填写和他人一致的配置"
注:如果采用goland等之类的编译器开发,还需要注意是否在编译器的设置中进行了相关的设置(我自己就是,命令行修改不生效,因为编译器中进行了额外的配置),如果编译器进行设置也需要同步进行调整,调整方式因编译不同,修改也不同,这里就不介绍了。
2. 完成上述修改后需要先删除项目的go.sum文件
rm -rf go.sum
- 执行清理缓存的操作(必须进行,否则go mod还缓存着之前的数据)
go clean -modcache
- 完成上述所有操作后,在项目目录下执行:
go mod tidy
至此,就完成了checksum mismatch问题的解决,这个时候你再对比自己的go.sum文件和组内其他人的就是一致的了,如果是个人开发者,后续执行go mod tidy
也不会遇到checksum mismatch的问题,如果还遇到可以按照上面的流程再检查下自己的配置。