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

相关推荐
fs哆哆1 小时前
在VB.net中一维数组,与VBA有什么区别
java·开发语言·数据结构·算法·.net
蝎子莱莱爱打怪1 小时前
Hadoop3.3.5、Hbase2.6.1 集群搭建&Phoenix使用记录
大数据·后端·hbase
johnZhangqi1 小时前
深圳大学-计算机信息管理课程实验 C++ 自考模拟题
java·开发语言·c++
David爱编程2 小时前
并发编程三大特性全解析:原子性、可见性、有序性,一文讲透!
java·后端
Sally璐璐2 小时前
Go语言变量声明与初始化详解
java·开发语言·golang
luofeiju2 小时前
交叉编译笔记
开发语言
StudyWinter3 小时前
【C++】仿函数和回调函数
开发语言·c++·回调函数·仿函数
你的人类朋友3 小时前
git常见操作整理(持续更新)
前端·git·后端
你的人类朋友3 小时前
git中的Fast-Forward是什么?
前端·git·后端
C4程序员3 小时前
北京JAVA基础面试30天打卡14
java·开发语言·面试