前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Go 开发常用操作技巧--模块管理

Go 开发常用操作技巧--模块管理

作者头像
微客鸟窝
发布于 2023-01-09 11:20:30
发布于 2023-01-09 11:20:30
57700
代码可运行
举报
文章被收录于专栏:Go语言指北Go语言指北
运行总次数:0
代码可运行

Go 依赖管理经历了 3 个阶段,GOPATH、Go Vendor、Go Module。

  1. GOPATH

GOPATH 是 Go 语言的一个环境变量,它是 Go 项目的工作区。目录有 3 个结构:

  • bin:项目编译的二进制文件
  • pkg:项目编译生成的lib包
  • src:项目源码

go get 会下载最新版本的包到 src 目录下。因为 src 下只能允许一个版本的存在,所以对于多个项目依赖同一个库的不同版本这种情况,GOPATH 管理模式就显得力不从心了。至此,Go Vendor 出现了。

  1. Go Vendor

1.5 版本推出了vendor机制。就是每个项目的根目录下有一个 vendor 目录,里面存放了该项目的依赖包。go build 的时候会先去 vendor 目录中查找依赖,如果没有找到再去 GOPATH 目录下查找。这样每个项目引入一份依赖的副本,解决了多个项目需要使用同一个 package 依赖的冲突问题。

vendor 机制的缺点是,同一个依赖包如果不同工程想重用,都必须各自复制一份在自己的vendor目录下。不能重用,使得冗余度上升。

  1. Go Module

从 Go1.11 版本开始,官方推出Go module作为包管理工具,在 Go 1.16 默认开启,可以看到在项目目录下有一个 go.mod 文件,且工程项目可以放在GOPATH路径之外。

go mod 使用

设置的命令如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

可在命令行中输入:go env 查看 GO111MODULE=on 。

go mod 常用命令:

  • go mod download:下载模块到本地缓存,缓存路径是 $GOPATH/pkg/mod/cache
  • go mod edit:是提供了命令版编辑 go.mod 的功能,例如 go mod edit -fmt go.mod 会格式化 go.mod
  • go mod graph:把模块之间的依赖图显示出来
  • go mod init:在当前文件夹下初始化一个新的 module,创建 go.mod 文件
  • go mod tidy:增加缺失的包,移除没用的包
  • go mod vendor:把依赖拷贝到 vendor 目录下
  • go mod verify:校验依赖
  • go mod why:解释为什么需要包和模块
  1. 创建 module

工程项目可以放在 GOPATH 路径之外,执行go mod init modulename 命令可以创建一个 go.mod 文件。在项目根目录建一个 go.mod 文件即可。

go.mod文件结构

  • module :指定模块的名称 (路径)
  • go :依赖的原生 Go SDK 版本
  • require :项目所依赖的模块
  • replace :可以替换依赖的模块
  • exclude :可以忽略依赖的模块
  1. 添加依赖

在 Go1.16 版本之前,运行 go 命令(go run、go build、go test)时,会自动下载并修改 go.mod 文件。 在 Go1.16 版本中,运行go命令,如果 import 的依赖再 go.mod 文件中没有,就不会再自动下载,而会提示错误,需要手动执行 go get 命令下载对应的包。因为自动下载的方式,如果在导入的包没有提供任何依赖的情况下自动添加新的依赖,有可能会引起公共依赖包的升级等。

  1. go get更新依赖
  • go get -u :更新到最新的次要版本或者修订版本(x.y.z)
  • go get -u=patch :更新到最新的修订版本
  • go get package@version :更新到指定的版本号version
  • 运行 go get 如果有版本的更改,那么 go.mod 文件也会作出相应的更改。
  1. go.sum 文件

go.sum 是记录了所有依赖的 module 的校验信息,以防下载的依赖被恶意篡改,主要用于安全校验。格式如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<module> <version> <hash>
<module> <version>/go.mod <hash>

module 是依赖的路径。version 是依赖的版本号。如果 version 后面跟 /go.mod 表示对哈希值是 module 的 go.mod 文件;否则,哈希值是 module 的.zip文件。

go.mod 和 go.sum 文件都需要被加入版本管理中。


图片及部分相关技术知识点来源于网络搜索,侵权删!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-12-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微客鸟窝 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Go项目管理
包被导入时,会执行init函数,优先于main函数,不能有参数和返回值,建议少用,仅用于全局变量初始化,或者单元测试初始化一些东西
用户9022575
2021/10/01
1K0
Go Modules知识点总结
起初Go语言在1.5之前没有依赖管理工具,若想引入依赖库,需要执行go get命令将代码拉取放入GOPATH/src目录下,作为GOPATH下的全局依赖,这也就意味着没有版本控制及隔离项目的包依赖;
Golang梦工厂
2023/02/26
8650
Go Modules知识点总结
Go——依赖管理
在Go1.5 release的版本的发布vendor目录被添加到除了GOPATH和GOROOT之外的依赖目录查找的解决方法。 查找依赖包路径的解决 当前包下的vendor目录 先上级的目录查找,直到找到scr的vendor目录 在GOPATH下面查找依赖包 在GOROOT目录下查找
羊羽shine
2019/05/29
1.4K0
Go mod包依赖管理工具使用详解
对比上面几点: 目前做的最好的也就 maven了,gradle没有使用过,不知道。
OwenZhang
2021/12/08
1K0
Go mod包依赖管理工具使用详解
浅谈GoPath和Go Modules包管理
从v1.5开始开始引入vendor模式,如果项目目录下有vendor目录,那么go工具链会优先使用vendor内的包进行编译、测试等
仙人技术
2021/08/31
1.2K0
浅谈GoPath和Go Modules包管理
Go Module详细使用教程,包管理不在难
go modules是 golang 1.11引入的新特性。模块是相关Go包的集合。modules是源代码交换和版本控制的单元。go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。
公号:咻咻ing
2020/03/04
20.6K0
go mod使用
最近由于换工作,开始交接工作。整理以前的工作内容,由于组内就我一个在做go和大数据。 所以开发没有规划,当时是怎么快怎么来。go也是使用最传统的go path的方式管理的。都是手动管理依赖的。现在交接给他人,需要多人开发,发现很多问题。比如版本问题,各种依赖的问题等等。
若与
2020/05/18
1.6K0
浅谈Golang包管理module-aware
从Go 1.16 开始, module-aware 成为了默认模式,这表示 GO111MODULE 默认值为on. 换句话说就是,即使GO111MODULE不设置,也是使用 module-aware模式。 其实go mod从Go1.11就开始加入, Go1.13有重大变化,直到Go1.16成为默认,完全取代GOPATH模式。历史变化,见下表:
Markgogogo
2022/06/13
8050
浅谈Golang包管理module-aware
[Golang]包管理
本文是本人在探索 Go 最新的包管理 Go Modules 的一些总结,希望能够更深入了解 Go 最新的包管理方式,以及在实际环境中将它很好的使用起来。
别打名名
2020/07/28
1.8K0
Go语言基本环境变量与依赖管理
最近开始系统学习一下Golang这么新语言,记录一下它的基本环境变量配置以及依赖管理方式。编写本文的时候使用的Golang版本为go1.13.5 windows/amd64,其他版本不一定保证适合本文的内容。因为习惯,可能有时候把Go语言称为Go,有时候称为Golang。
Throwable
2020/06/23
9.3K1
Go module基础使用及Go 1.16中的改进
Go 1.11开始对模块进行支持,主要目的就是使用模块来管理依赖。本文介绍使用modules的一些基本操作以及在Go 1.16版本中的变化。
Go学堂
2023/01/31
4630
Go | 浅谈包管理模式
go的编译器会在 $GOPATH/src 下面寻找对应的模块,src 下的每一个目录都可以对应一个模块,目录中的目录也可以是一个模块
甜点cc
2022/11/16
5350
Go | 浅谈包管理模式
go modules:使用 mod 管理项目依赖包,通过vendor实现一键分发编译包
在go语言1.11版本之前,没有modules机制,所有软件包都在安装在$GOPATH/src目录下。不同项目如果引用了同一个软件包的不同版本,就会造成编译麻烦。修改$GOPATH变量是当时一种比较简单的解决方案。
LIYI
2020/03/25
6.6K0
Golang学习笔记,从入门到精通,持续记录
Golang官网:https://go.dev/、Golang下载:https://go.dev/、Golang学习文档:https://go.dev/doc/
房东的狗丶
2023/02/17
1.3K0
Go编程之相关命令工具记录
该命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装,整个过程类似安装App一样;
全栈工程师修炼指南
2022/09/29
6310
Golang 1.16 中 Module 有什么变化?
golang 1.16 默认开启 Modules,即使不存在 go.mod,Go 命令现在默认情况下也会在 module-aware(模块感知)模式下构建包。
frank.
2021/03/09
2K0
golang mod 入门
go modules 是 golang 1.11 新加的特性。现在1.12 已经发布了,是时候用起来了。Modules官方定义为:
goodspeed
2020/12/22
8500
go的包管理
go没有命名空间的概念,只有包的概念,每个目录下的package名需要一致,但是不需要跟所在目录名相同:
仙士可
2022/01/18
7280
go的包管理
Go Modules 终极入门
Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go 官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。
madneal
2020/03/10
1.9K0
Go Modules 终极入门
GO 依赖管理工具go Modules(官方推荐)
以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样,随着go modules 在go1.11版推出,go1.12版功能不断改进,再到go1.13版完善优化,正式扶正。预计dep将来也只能定格在“official experiment”了。
孤烟
2020/09/27
1.8K1
相关推荐
Go项目管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验