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源码,需要自己写个脚本,下载源代码,使用源代码编译安装

相关推荐
Patrick_Wilson1 小时前
Go 为什么需要 defer?从函数怎么收尾说起
后端·go·编程语言
苏三说技术1 小时前
DeepSeek Harness入驻B站,评论区被干成了大型插件集市!
后端
橙序员小站1 小时前
我一句话让 AI 把公众号工作台搭完了:部署实测记录
后端
Fatbobman(东坡肘子)2 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
Patrick_Wilson2 小时前
从文本输出理解 Go 方法与接口
后端·go·编程语言
揽星河..2 小时前
【C语言】底层程序设计
c语言·开发语言
JavaPub-rodert2 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
QCoding2 小时前
企业级Agent Evaluation实战:Agent能跑就能上线?AI Agent到底怎么测?
后端·spring
苍何3 小时前
让 WorkBuddy 操控浏览器,干活有点猛啊1
后端
海的透彻3 小时前
dockerfile如何快速构建容器(java服务)
java·开发语言