go kratos手动更新依赖
今天用kratos发现一个有点麻烦的问题:我安装的go版本为1.25.3,但是kratos对包golang.org/x/tools的默认依赖是v0.17.0:
$ GOWORK=off go generate ./...
go: downloading golang.org/x/tools v0.17.0
go: downloading github.com/google/subcommands v1.2.0
protocol error: received DATA after END_STREAM
go: downloading golang.org/x/mod v0.14.0
# golang.org/x/tools/internal/tokeninternal
但是这个版本太老了以至于我安装的时候报错:
/go/pkg/mod/golang.org/x/tools@v0.17.0/internal/tokeninternal/tokeninternal.go:78:9: invalid array length -delta * delta (constant -256 of type int64)
报错的原因是代码中自动检查tokenFileSet的大小,由于使用了unsafe库,go1.25里改变了这个参数的值,破坏了go本身的向下兼容性,就导致了升级到更新版本的go,老版本依赖无法支持的问题。
const delta = int64(unsafe.Sizeof(tokenFileSet{})) - int64(unsafe.Sizeof(token.FileSet{}))var _ [-delta * delta]int
这个问题在新版本的golang.org/x/tools里面修复了。那么我希望使用最新版本解决这个问题:
go get golang.org/x/tools@latest
于是虽然IDE代码检查的时候有警告(提示该依赖没有被使用):

但是编译代码还是会根据go.mod文件中指定的0.38.0版本进行。
警告也有点麻烦,于是我尝试重新寻找依赖:
$ go get golang.org/x/tools@none
$ go mod tidy
$ go generate ./...
go: downloading golang.org/x/tools v0.37.0
go: downloading golang.org/x/mod v0.28.0
wire: app-tslt/cmd/app-tslt: wrote /home/tony/rucomm/backend_services/app-tslt/cmd/app-tslt/wire_gen.go
居然找到了正确版本的依赖。这可能说明之前寻找依赖的算法有点问题?但是解决了就好
