golang 包管理

本文详细介绍了Go语言的包管理机制,包括go module的常用命令、代码组织形式、依赖记录、镜像代理、依赖验证、升级依赖、查看依赖拓扑、检查依赖更新,以及go vendor的使用。此外,还讨论了import、init函数的使用和私有仓库的搭建。通过本文,读者可以全面了解Go语言的包管理和依赖管理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

管理package

go module

  • module解决的问题
    • 多版本的工程代码无法隔离
      • 多个repo无法同时依赖一个仓库的不同版本代码
    • 对于GOPATH的强制依赖约束
      • 所有代码必须组织在GOPATH目录下
    • 无法自动化下载依赖
      • 编译时还要考虑环境中是否存在依赖包

常用命令

// 初始化go module
go mod init xxxx 
// 下载依赖、添加缺失的依赖、删除无用的依赖
go mod tidy
// 编译go.mod文件
go mod edit [-require/-replace/retract...]
// 清除所有本地下载的依赖库
go clean -modcache

// 添加或更新指定依赖, 可以指定版本或分支, 比如"@v1.1.0, @latest, @dev"
go get xyz@v
// 更新当前module下所有的直接依赖到最新的小版本
go get ./...
// 更新xyz的所有依赖(包括直接和间接)到最新的小版本
go get -u xyz
// 更新xyx的所有依赖(包括直接和间接)到最新的补丁版本
go get -u=patch xyz

// 输出依赖关系图谱,一般和grep配合使用
go mod graph
// 输出指定依赖的依赖链路
go mod why -m x.y.z@v
// 输出所有参与到编译的依赖
go list -m  all
// 输出最新版本
go list -u -m x.y.z
// 输出所有未撤回版本
go list -m -versions x.y.z

代码组织形式

  • 开启module模式后,项目不再一定要组织在GOPATH路径下,可以任意定义项目目录
    • 此后$GOPATH/src基本上没有意义了
    • 通过go env -w GO111MODULE=on开启
  • 所有依赖包的源码也不再是组织在src目录下,而是$GOPATH/pkg/mod目录下
    • 该目录下的包名后面还会有@<tag_num>,这样go mod就可以区分不同版本
      • 例如$GOPATH\pkg\mod\github.com\go-sql-driver\mysql@v1.5.0
    • $GOPATH/pkg/mod/cache/download目录下包含了原始的下载缓存
      • 包括.mod.zip,.lock等类型的文件

在这里插入图片描述

  • 如果被引用代码的版本号没变,但是代码变动了,需要清除所有本地依赖缓存后,才会重新拉取远端的代码
    • 即通过go clean -modcache清除$GOPATH/pkg/mod目录下的所有缓存文件
    • 在做实验或者代码版本管理比较乱的时候,可能会出现的这种情况

依赖记录(go.mod)

module github.com/example/module-repo

go 1.13

require (
    example.com/apple v0.1.2
    example.com/banana v1.2.3
    example.com/banana/v2 v2.3.4
    example.com/pear v1.1.1 // indirect
    example.com/strawberry v2.1.1+incompatible 
    example.com/orange v0.0.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值