為什么已經在module/項目中使用go mod download下來所需依賴了浅妆,但是之后運行go 命令仍然出現(xiàn)了缺少依賴的錯誤
- 問題來源:
[root@192 helloworld]# go generate ./...
/root/go/pkg/mod/github.com/google/wire@v0.5.0/cmd/wire/main.go:34:2: missing go.sum entry for module providing package github.com/google/subcommands (imported by github.com/google/wire/cmd/wire); to add:
go get github.com/google/wire/cmd/wire@v0.5.0
/root/go/pkg/mod/github.com/google/wire@v0.5.0/internal/wire/copyast.go:21:2: missing go.sum entry for module providing package golang.org/x/tools/go/ast/astutil (imported by github.com/google/wire/internal/wire); to add:
go get github.com/google/wire/internal/wire@v0.5.0
/root/go/pkg/mod/github.com/google/wire@v0.5.0/internal/wire/parse.go:30:2: missing go.sum entry for module providing package golang.org/x/tools/go/packages (imported by github.com/google/wire/internal/wire); to add:
go get github.com/google/wire/internal/wire@v0.5.0
/root/go/pkg/mod/github.com/google/wire@v0.5.0/internal/wire/analyze.go:26:2: missing go.sum entry for module providing package golang.org/x/tools/go/types/typeutil (imported by github.com/google/wire/cmd/wire); to add:
go get github.com/google/wire/cmd/wire@v0.5.0
cmd/helloworld/wire_gen.go:3: running "go": exit status 1
我使用kratos新建了一個helloworld項目抠艾,并且運行了go mod download
下載依賴包谷饿,并且之后查看了~/go/pkg/mod/目錄钾唬,感覺一切正常,
但是在執(zhí)行go generate ./...
命令的時候卻出現(xiàn)了上述報錯
其中go generate會自動去執(zhí)行go run github.com/google/wire/cmd/wire
,這是源自項目中一個go generate注釋:
// Code generated by Wire. DO NOT EDIT.
//go:generate go run github.com/google/wire/cmd/wire
//go:build !wireinject
// +build !wireinject
package main
import (
"github.com/go-kratos/kratos/v2"
"github.com/go-kratos/kratos/v2/log"
"helloworld/internal/biz"
"helloworld/internal/conf"
"helloworld/internal/data"
"helloworld/internal/server"
"helloworld/internal/service"
)
這么一看是缺少了github.com/google/subcommands
以及wire依賴的其他的幾個包赃春,但是事實上我項目中的go.mod
文件以及項目中的代碼中均有引入github.com/google/wire
這個包進行使用静秆,而subcommands這幾個包作為wire的依賴包卻沒有被安裝進來
解決辦法:
上述報錯提到依賴github.com/google/subcommands
的包是github.com/google/wire/cmd/wire
,go提供了一個命令go mod why packageName
用于查看這個包的依賴項严衬,也就是看具體是誰依賴了這個包澄者,比如go.mod文件下也有很多間接依賴,后面打上了 //indirect注釋,
這個時候就可以通過go mod why
來查看到底是哪個包依賴了它的请琳,所以這里我們也使用why命令來檢查github.com/google/wire/cmd/wire
,
得到:
[root@192 helloworld]# go mod why github.com/google/wire/cmd/wire
# github.com/google/wire/cmd/wire
(main module does not need package github.com/google/wire/cmd/wire)
發(fā)現(xiàn)居然沒有包用到它粱挡,查看它的源碼發(fā)現(xiàn),這個目錄下面只有一個main.go俄精,進一步檢查前往github.com/google/wire
這個包去全文搜索發(fā)現(xiàn)询筏,整個項目其實沒有一處require這個包的,加上go generate這個命令后面的命令發(fā)現(xiàn)竖慧,也就是說這個包只是通過在命令行直接使用go run github.com/google/wire/cmd/wire來使用的嫌套。
而golang中對于依賴下載的這個特性是1.17之后加上的,名為修剪依賴圾旨,指的是如果沒有被主模塊使用到的包灌危,將不會被加載
參考資料: