go mod 依赖管理的具体使用

 更新时间:2024年01月28日 09:55:31   作者:白如意i  
在Go语言开发中,依赖管理是一项非常重要的工作,Go mod作为官方的包管理工具已经成为了Go语言依赖管理的首选方式,本文就来介绍一下go mod 依赖管理的具体使用,具有一定的参考价值,感兴趣的可以了解一下

注:如果你的 GoLand 不会自动拉取依赖,检查一下 IDE 配置里面是不是没有启用 Go Modules。

go mod 介绍

Modules 官方定义为:

模块是相关 Go 包的集合。modules 是源代码交换和版本控制的单元。go 命令直接支持使用 modules,包括记录和解析对其他模块的依赖性。
modules 替换旧的基于 GOPATH 的方法来指定在给定构建中使用哪些源文件。

mod 相关环境变量

# Modules 开关
GO111MODULE="auto"
# Go 模块代理(脱离VCS版本控制方式,直接通过镜像站点来拉取)
GOPROXY="https://proxy.golang.org,direct" # 国内无法访问
# 保证拉取到的模块版本数据未经过篡改
GOSUMDB="sum.golang.org" # 国内无法访问
# 私有模块配置(用于Go 模块代理无法访问到的地方,如私有库)
GONOPROXY=""
GONOSUMDB=""
GOPRIVATE=""

如何使用 go mod

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct

我们可以先设置一下 GO111MODULE 和 GOPROXY 环境变量,可以直接加到环境变量中:

  • GO111MODULE=on 开启 go modules 功能
  • GOPROXY 设置 go 代理,下载依赖的时候可以更快地下载

go.mod 文件

启用了 Go modules 的项目,初始化项目时,会生成一个 go.mod 文件。描述了当前项目(也就是当前模块)的元信息

# module:用于定义当前项目的模块路径。
module github.com/eddycjy/module-repo

# go:用于标识当前模块的 Go 语言版本,值为初始化模块时的版本,目前来看还只是个标识作用。
go 1.13

# require:用于设置一个特定的模块版本。
require (
    example.com/apple v0.1.2
    example.com/banana v1.2.3
    example.com/banana/v2 v2.3.4
    example.com/pear // indirect	# indirect 标识表示该模块为间接依赖
    example.com/strawberry // incompatible
)

# exclude:排除一个特定的模块版本。
exclude example.com/banana v1.2.4

# replace:用于将一个模块版本替换为另外一个模块版本。
replace example.com/banana => example.com/fish

go mod 命令

  • go mod download:下载依赖包
  • go mod edit:编辑 go.mod
  • go mod graph:打印模块依赖图
  • go mod init:初始化新的 go module 在当前目录(嗯,是的,我们写的代码其实也等于是一个 go module)
  • go mod tidy:拉取缺少的模块,移除不用的模块
  • go mod vendor:将依赖复制到 vendor 下
  • go mod verify:验证依赖是否正确
  • go mod why:解释为什么需要依赖

go.mod 文件

module hello

go 1.18

go.mod 文件一旦创建后,它的内容将会被 go toolchain 全面掌控。go toolchain 会在各类命令执行时,比如 go getgo buildgo mod 等修改和维护 go.mod 文件。

go.mod 提供了 modulerequirereplace 和 exclude 四个命令。

  • module:指定包的名字(路径)
  • require:指定依赖项模块
  • replace:替换依赖模块(比如自己修改了一版,就可以使用 replace 将依赖替换为自己的实现,但是代码里面 import 路径还是旧的路径)
  • exclude:用于排除某个包的特定版本,与 replace 类似,仅在当前 module 为 main module 时有效,其他项目引用当前项目时,exclude 指令会被忽略

go module 安装依赖的原则是先拉取最新的 release tag,若无则拉最新的 commit。

go 会自动生成一个 go.sum 文件来记录 dependency tree。

go get 升级

go get -u need-upgrade-package

升级后会将新的依赖版本更新到 go.mod,也可以使用 go get -u 升级所有依赖。

  • 运行 go get -u 将会升级到最新的次要版本或者修订版本(x.y.z 是修订版本号,y 是次要版本号)
  • 运行 go get -u=patch 将会升级到最新的修订版本
  • 运行 go get package@version 将会升级到指定的版本号 version
  • 运行 go get 如果有版本的更改,那么 go.mod 文件也会更改

go.sum

这个文件记录了当前拉取的实际的版本号。可以保证我们每次拉取的都是相同的版本,除非我们手动去更新。

不同模式的命令区别

1. gopath模式

在工程经过go build、go install或 go get等指令后,会将拉取的第三方xxx依赖包放在GOPATH/src目录下

2. go vendor模式

go build 时的应用路径搜索调整成为 优先搜当前工程路径/vendor目录

2. go module模式

  • 拉取依赖路径
    Go Modules 模式下,下载的包是存在 $GOPATH/pkg/mod 目录下的

  • 拉取指定版本
    GoModules 模式下,可以下载指定版本的包

go get {模块名}@{最新版本: latest|分支: master|tag: v0.3.2|hash: 342b2e}

通常拉取到本地后,配合go mod tidygo mod vendor就能有效的加载到我们程序中使用的包,同时会更新掉go.mod配置文件。

到此这篇关于go mod 依赖管理的具体使用的文章就介绍到这了,更多相关go mod 依赖管理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • GoLang中的加密方法小结

    GoLang中的加密方法小结

    这篇文章主要介绍了GoLang中的加密方法。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • 详解Go语言中关于包导入必学的 8 个知识点

    详解Go语言中关于包导入必学的 8 个知识点

    这篇文章主要介绍了详解Go语言中关于包导入必学的 8 个知识点,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-08-08
  • Go操作etcd的实现示例

    Go操作etcd的实现示例

    etcd是近几年比较火热的一个开源的、分布式的键值对数据存储系统,提供共享配置、服务的注册和发现,本文主要介绍etcd的安装和使用,感兴趣的可以了解一下
    2021-09-09
  • Golang中Model的具体使用

    Golang中Model的具体使用

    本文主要介绍了Golang中Model的具体使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • golang 后台进程的启动和停止操作

    golang 后台进程的启动和停止操作

    这篇文章主要介绍了golang 后台进程的启动和停止操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Golang分布式应用定时任务示例详解

    Golang分布式应用定时任务示例详解

    这篇文章主要为大家介绍了Golang分布式应用定时任务示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • go版tensorflow安装教程详解

    go版tensorflow安装教程详解

    这篇文章主要介绍了go版tensorflow安装教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • 深入理解go slice结构

    深入理解go slice结构

    这篇文章主要介绍了go slice结构,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-09-09
  • 一文带你掌握Golang的反射基础

    一文带你掌握Golang的反射基础

    go的反射是由其标准库中的reflect包实现,该reflect包实现了在运行时进行反射的能力,本篇主要介绍了reflect的常用的几个方法,希望对大家有所帮助
    2023-02-02
  • Go mod replace使用方法及常见问题分析

    Go mod replace使用方法及常见问题分析

    这篇文章主要为大家介绍了Go mod replace使用方法及常见问题分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08

最新评论