go install报错: should be v0 or v1, not v2问题解决

1. 背景

执行go install时,报错

go 复制代码
go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
-> unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/golangci-lint/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.99.1: invalid version: should be v0 or v1, not v2
-> unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd@v2.99.1: invalid version: should be v0 or v1, not v2
-> unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/golangci-lint/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.99.1: invalid version: should be v0 or v1, not v2
-> unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd@v2.99.1: invalid version: should be v0 or v1, not v2
go: github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest: unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/golangci-lint/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.99.1: invalid version: should be v0 or v1, not v2

2. 排查过程

由于网络上搜不到相关信息,以下通过查看源码的方式排查

2.1. 打开go源码,搜索unzip关键字,找到upzip方法,下面看到日志->和输出的很像,加上sl前缀,重新打包运行查看
2.2. 重新打包
go 复制代码
cd src
./make.bash
2.3. 运行
go 复制代码
cd /Users/albert/go/go1.21/go1.21.7/bin
./go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
go 复制代码
sl-> unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/golangci-lint/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.99.1: invalid version: should be v0 or v1, not v2
sl-> unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd@v2.99.1: invalid version: should be v0 or v1, not v2
sl-> unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd@v2.99.1: invalid version: should be v0 or v1, not v2
sl-> unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/golangci-lint/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.99.1: invalid version: should be v0 or v1, not v2
go: github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest: unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/golangci-lint/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.99.1: invalid version: should be v0 or v1, not v2
2.4. 一步一步多加点日志
2.5. 能发现是cmd/vendor/golang.org/x/mod/zip/zip.go:810处报的错
    1. 由于后面还有改动代码,添加注释等,截图和运行结果稍有不匹配
go 复制代码
./go install github.com/golangci/golangci-lint/v2/cmd/golangci-lint@latest
sl2-stack trace:
goroutine 17 [running]:
runtime/debug.Stack()
	runtime/debug/stack.go:24 +0x5e
cmd/vendor/golang.org/x/mod/zip.Unzip.func1()
	cmd/vendor/golang.org/x/mod/zip/zip.go:790 +0x45
cmd/vendor/golang.org/x/mod/zip.Unzip({0xc0000329c0, 0x57}, {{0x7ff7bfefef25?, 0x0?}, {0xc0000131e8?, 0xc0000131e8?}}, {0xc000106930, 0x6d})
	cmd/vendor/golang.org/x/mod/zip/zip.go:810 +0x455
cmd/go/internal/modfetch.download({0x1789e70, 0x1b2dce0}, {{0x7ff7bfefef25?, 0x9a0000c0002840e0?}, {0xc0000131e8?, 0x9a387d2d4521074e?}})
	cmd/go/internal/modfetch/fetch.go:154 +0x765
cmd/go/internal/modfetch.Download.func1()
	cmd/go/internal/modfetch/fetch.go:55 +0x5e
cmd/go/internal/par.(*ErrCache[...]).Do.func1()
	cmd/go/internal/par/work.go:119 +0x13
cmd/go/internal/par.(*Cache[...]).Do(0x178e120, {{0x7ff7bfefef25, 0x36}, {0xc0000131e8, 0x7}}, 0xc0001dbbf0)
	cmd/go/internal/par/work.go:160 +0x125
cmd/go/internal/par.(*ErrCache[...]).Do(0x0?, {{0x7ff7bfefef25?, 0xc00020c340?}, {0xc0000131e8?, 0xc00028c000?}}, 0xc00028e000?)
	cmd/go/internal/par/work.go:118 +0x4f
cmd/go/internal/modfetch.Download({0x1789e70?, 0x1b2dce0}, {{0x7ff7bfefef25?, 0x7?}, {0xc0000131e8?, 0x78?}})
	cmd/go/internal/modfetch/fetch.go:54 +0x13a
cmd/go/internal/modload.fetch({0x1789e70, 0x1b2dce0}, {{0x7ff7bfefef25?, 0x1789e70?}, {0xc0000131e8?, 0xc000026360?}})
	cmd/go/internal/modload/import.go:757 +0x345
cmd/go/internal/modload.QueryPattern.func4.1({0x1789e70, 0x1b2dce0}, {0x7ff7bfefef25, 0x36})
	cmd/go/internal/modload/query.go:723 +0x305
cmd/go/internal/modload.queryPrefixModules.func1({0x7ff7bfefef25?, 0x0?}, 0xc00021c000)
	cmd/go/internal/modload/query.go:813 +0x57
created by cmd/go/internal/modload.queryPrefixModules in goroutine 1
	cmd/go/internal/modload/query.go:812 +0x127

sl-> sl1->unzip /Users/albert/go/pkg/mod/cache/download/github.com/golangci/golangci-lint/v2/cmd/golangci-lint/@v/v2.99.1.zip: github.com/golangci/golangci-lint/v2/cmd/golangci-lint@v2.99.1: invalid version: should be v0 or v1, not v2
2.6. 由于debug.stack只能打印出本文件的链路,无法自动下钻,定位到checkBip方法后,进到方法里再添加debug.stack
2.7. Check方法
2.8. 写了个单测,SplitPathVersion方法拿到的pathmajor是空字符串
2.9. CheckPathMajor方法里,v为v2.99.1,而pathmajor为空字符串。根据方法里的判断,如果pathmajor为空字符串,那么版本应该为v0或者v1, 而v=v2.99.1,导致报错

3. 原因总结

问题原因在于,SplitPathVersion方法拿到的path是github.com/golangci/golangci-lint/v2/cmd/golangci-lint,解析出来pathMjaor为空字符串,CheckPathMajor方法里判定应该是V0或V1。正确的SplitPathVersion拿到的入参应该是github.com/golangci/golangci-lint/v2,入参没有做处理导致出问题

4. 解决方法

由于这个是go源码的问题,不好直接改动go源码,需要自己写个脚本,下载源代码,使用源代码编译安装

相关推荐
企微自动化几秒前
企业微信外部群自动化系统的异常处理机制设计
开发语言·python
墨&白.1 分钟前
如何卸载/更新Mac上的R版本
开发语言·macos·r语言
今天过得怎么样2 分钟前
彻底搞懂 Spring Boot 中 properties 和 YAML 的区别
后端
qq_12498707535 分钟前
基于springboot的幼儿园家校联动小程序的设计与实现(源码+论文+部署+安装)
java·spring boot·后端·spring·微信小程序·小程序
技术小甜甜10 分钟前
[Python] 使用 Tesseract 实现 OCR 文字识别全流程指南
开发语言·python·ocr·实用工具
leo__52015 分钟前
MATLAB 实现 基分类器为决策树的 AdaBoost
开发语言·决策树·matlab
老朱佩琪!20 分钟前
Unity原型模式
开发语言·经验分享·unity·设计模式·原型模式
毕设源码-郭学长20 分钟前
【开题答辩全过程】以 基于JAVA的车辆违章信息管理系统设计及实现为例,包含答辩的问题和答案
java·开发语言
while(1){yan}21 分钟前
UDP和TCP的核心
java·开发语言·网络·网络协议·tcp/ip·udp
后端小张26 分钟前
【Java 进阶】深入理解Redis:从基础应用到进阶实践全解析
java·开发语言·数据库·spring boot·redis·spring·缓存