美文网首页
Go的间接依赖

Go的间接依赖

作者: 瀧浩灬 | 来源:发表于2022-09-20 01:58 被阅读0次

为什么已经在module/项目中使用go mod download下来所需依赖了,但是之后运行go 命令仍然出现了缺少依赖的错误

  • 问题来源:
[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/目录,感觉一切正常,
但是在执行go generate ./...命令的时候却出现了上述报错
其中go generate会自动去执行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)

发现居然没有包用到它,查看它的源码发现,这个目录下面只有一个main.go,进一步检查前往github.com/google/wire这个包去全文搜索发现,整个项目其实没有一处require这个包的,加上go generate这个命令后面的命令发现,也就是说这个包只是通过在命令行直接使用go run github.com/google/wire/cmd/wire来使用的。

而golang中对于依赖下载的这个特性是1.17之后加上的,名为修剪依赖,指的是如果没有被主模块使用到的包,将不会被加载

参考资料:

相关文章

  • Go的间接依赖

    为什么已经在module/项目中使用go mod download下来所需依赖了,但是之后运行go 命令仍然出现了...

  • go依赖包管理--间接依赖

    indirect含义 在使用Go module过程中,随着引入的依赖增多,会发现go.mod文件中部分依赖包后面会...

  • Go语言 依赖管理

    Go语言 依赖管理 go依赖管理的三个阶段 GOPATH GOVENDOR go mod GOPATH默认在~/g...

  • Go语言的依赖管理

    Go语言的依赖管理随着版本的更迭正逐渐完善起来。 依赖管理 为什么需要依赖管理 最早的时候,Go所依赖的所有的第三...

  • golang 1.4 mod 使用经验

    1.go mod 替代原来gopath的功能,依赖包下载依赖Go环境变量 2.go mod init 一个gola...

  • Go vendor使用

    各种依赖包报错: 下载go vendor:go get -u -v github.com/kardianos/go...

  • Golang中的常用命令

    Go命令行有常用的这几个命令: go build 编译包和依赖 go run 编译和运行go程序 go insta...

  • GO modules详解

    什么是Go Modules? Go modules 是 Go 语言的依赖解决方案,发布于 Go1.11,成长于 G...

  • 在go中go get git资源失败解决

    1. 打开preferences找到Go Modules配置环境 添加Go Proxy 2. 获取所有依赖 go ...

  • SSM单体架构项目 (上)

    课程管理模块 Maven 间接依赖(依赖传递) 依赖冲突 依赖传递导致的:同一个工程 依赖传递 了不同版本的相同j...

网友评论

      本文标题:Go的间接依赖

      本文链接:https://www.haomeiwen.com/subject/tmymortx.html