0、包管理的历史
Golang 的包管理一直被大众所诟病的一个点,但是我们可以看到现在确实是在往好的方向进行发展。
下面是官方的包管理工具的发展历史:
-
在 1.5 版本之前,所有的依赖包都是存放在 GOPATH 下,没有版本控制。这个类似 Google 使用单一仓库来管理代码的方式。这种方式的最大的弊端就是无法实现包的多版本控制,比如项目 A 和项目 B 依赖于不同版本的 package,如果 package 没有做到完全的向前兼容,往往会导致一些问题。
-
1.5 版本推出了 vendor 机制。所谓 vendor 机制,就是每个项目的根目录下可以有一个 vendor 目录,里面存放了该项目的依赖的 package。go build 的时候会先去 vendor 目录查找依赖,如果没有找到会再去 GOPATH 目录下查找。
-
1.9 版本推出了实验性质的包管理工具 dep,这里把 dep 归结为 Golang 官方的包管理方式可能有一些不太准确。关于 dep 的争议颇多,比如为什么官方后来没有直接使用 dep 而是弄了一个新的 modules,具体细节这里不太方便展开。
-
1.11 版本推出 modules 机制,简称 mod,也就是本文要讨论的重点。modules 的原型其实是 vgo,关于 vgo,可以参考文章末尾的参考链接。https://research.swtch.com/vgo
1、go mod是什么?
go mod 是Golang 1.11 版本引入的官方包(package)依赖管理工具,用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包的管理。
之前Golang 主要依靠vendor和GOPATH来管理依赖库,vendor相对主流,但现在官方更提倡go mod。
总结一下:
-
从go 1.11开始支持
-
可以不需要gopath存在
-
环境变量GO111MODULE,默认为auto
-
项目存在go.mod则使用go module,否则使用GOPATH和vendor机制
2、依赖管理
1)为什么需要依赖?
我们想复用已有的工作成果。
将已有的工作成果加入我们项目中作为依赖存在太多的不确定性:
包API的变化;包内部行为变化;包的依赖会变化;包已经不存在或无法访问;包与包之间的不同依赖相互冲突等
随着软件开发规模的逐步增大,涉及到的外部依赖越来越多,手动管理的所有依赖愈发不可能。所以我们需要依赖管理,我们需要有个工具或者规范来描述和定义包与包之间的依赖关系,并自动化的去处理、解析和满足这些依赖。
3、基本使用
1)环境准备
Golang 版本:1.12.3。在 1.12 版本之前,使用 Go modules 之前需要环境变量 GO111MODULE:
-
GO111MODULE=off: 不使用 modules 功能。
-
GO111MODULE=on: 使用 modules 功能,不会去 GOPATH 下面查找依赖包。
-
GO111MODULE=auto: Golang 自己检测是不是使用 modules 功能。(默认)
2)初始化go module环境
带git的项目:go mod init
不带git的项目:go mod init packagename
3)下载依赖包
只下载依赖包
go mod download
拉取必须模块,移除不用的模块
go mod tidy
注意点:
-
如果tag对应内容有更新,需要删除pkg中的缓存内容。
-
cd $GOPATH/pkg/mod rm -rf *
-
go get、go run、go build 也会自动下载依赖
4)添加新依赖包
方法一:直接修改go.mod,然后执行:go mod download
方法二:使用go get packagename@v1.2.3,会自动更新 go.mod 文件
方法三:go run、go build也会自动下载依赖
5)将依赖包下载到vendor目录
go mod vendor
注意:只会下载对应版本的包文件,不会下载所有版本
4、总结
1)大部分场景 go mod init 和 go mod tidy就够了
2)查看$GOPATH/pkg/mod里面的文件就知道了,mod做了一件类似maven的事把所有包都打上了版本号。
解决多版本问题困扰。
相关推荐
Go语言在早期版本中并未内置包管理工具,这使得在大型项目中管理依赖变得相对复杂。为了解决这个问题,社区开发了多个第三方包管理器,其中glide是早期较为流行的一个。glide是由Masterminds团队开发的,它的目标是...
这个"GO语言包_64"显然包含了用于64位操作系统的Go语言开发环境。在64位操作系统上安装Go语言,用户可以利用更强大的计算资源进行程序开发。以下是关于Go语言及其开发环境的详细知识点: 1. **安装过程**:首先,你...
每个Go语言程序,都以package xxx开头,即申明本文件定义的所有函数、结构体,均从属于xxx包。当项目文件较多时,这种管理方式是所有编程语言的必然选择。相应地,通过import来调用包也是情理之中了,但低版本的Go...
Go-govendor是一款针对Go语言的包管理工具,它的出现是为了在Go的依赖管理领域提供一个更为可控和方便的解决方案。在Go的生态系统中,包管理是一个关键环节,因为Go的构建过程依赖于源代码的完整性和一致性。go...
`gopm`是一款为Go语言设计的独立包管理器和构建工具,它旨在简化Go项目的依赖管理和构建流程。与`go mod`相比,`gopm`在早期提供了图形化的界面和更直观的命令行操作,对于初学者或者习惯传统包管理方式的开发者来说...
本文将深入探讨"gom"——一个Go语言的包管理器。 ### 一、Go语言的包管理系统 Go语言原生的包管理方式是基于`go mod`(Go Modules)系统,它允许开发者明确指定项目依赖,并且在构建时自动下载和管理这些依赖。...
Go 包管理器(gopm)是 Go 的包管理器和构建工具。 自 Go 1.11 开始支持Go Modules Proxy,该项目已被存档并且网站(gopm.io)将于2019 年 12 月 31 日关闭。 Go 包管理器Gopm(Go 包管理器)是 Go 的 Go 包管理和...
Go语言,又称Golang,是由Google开发的一种静态类型的、编译型的、并发型的、垃圾回收式的、C风格的编程语言。这个“Go语言开发包”是针对Go语言的最新版1.4,适用于32位系统的zip格式安装文件。 1. **Go语言概述**...
这款系统软件包管理器使得在Linux和Windows上安装、更新和管理软件变得如同在Mac OS上使用Homebrew一样简单。GoFish的出现,打破了平台间的隔阂,为开发者和普通用户提供了一个统一的包管理体验。 首先,我们来深入...
Go语言,全称为Golang,是由Google开发的一种静态类型的、编译式的、并发型且具有垃圾回收功能的编程语言。自2009年发布以来,Go语言因其简洁的语法、高效的性能以及对并发编程的良好支持,逐渐在云计算、网络服务、...
Go还提供了一个强大的包管理器`go modules`,帮助开发者管理和版本控制项目依赖。 5. **并发编程**:Go语言通过goroutines和channels提供了轻量级线程和通信原语,鼓励使用 CSP(Communicating Sequential ...
Go语言的包管理与模块化开发,涵盖了Go包的基本概念、导入与使用、以及包的可见性等基础内容。文章接着深入探讨了Go Modules系统的引入背景、结构以及常用的依赖管理命令,解决了Go 1.11之前`GOPATH`管理模式带来的...
10. **工具链完善**:Go语言自带了一整套工具链,包括编译器(`go build`)、包管理器(`go get`)、格式化工具(`go fmt`)、测试框架(`go test`)等,使得开发流程更加顺畅。 11. **性能**:由于其静态编译和C...
在Go语言的生态系统中,`golang.org/x`是一个非常重要的模块集合,它包含了Go官方维护但未包含在标准库中的各种扩展包。这些包涵盖了网络、文本处理、加密算法等多个领域,为开发者提供了丰富的功能支持。由于网络...
在开发过程中,可以使用Go语言的标准库`net/http`来创建Web服务器,`database/sql`库处理数据库操作,以及`context`包来管理请求上下文。此外,Go的依赖管理工具`go mod`可以帮助组织项目依赖关系,确保代码的可维护...
总之,Go-gpm作为早期的Go包管理器,对于初学者和小型项目而言,提供了简单易用的依赖管理方式。尽管现在有更先进的替代方案,理解gpm的工作原理和使用方法,对理解Go语言的依赖管理历史和现状仍然是有价值的。
漂亮的Go语言通用后台管理系统,包含:计划任务 / MySQL管理 / Redis管理 / FTP管理 / SSH管理 / 服务器管理 / Caddy配置 / DDNS / FRP可视化配置 / 云存储管理 等功能。可运行于 Windows / Linux / MacOS 等主流...
本文将深入探讨“gotools go服务包”,这是一个专为Go语言打造的综合服务集合,它整合了go短信、go联系人和go桌面三大功能组件,旨在提升用户在移动设备上的体验。 首先,让我们从“go短信”组件开始分析。短信作为...
Go语言,又称Golang,是由Google设计的一种静态类型的、编译型的、并发型且具有垃圾回收功能的编程语言。其设计理念强调代码的简洁性、可读性和效率,特别适合构建高性能的网络服务和分布式系统。 本项目采用Go语言...
Go语言,也被称为Golang,是由Google开发的一种静态类型、编译型、并发型、垃圾回收的编程语言。它以其简洁的语法、高效的性能以及内置的并发支持,逐渐在后端开发领域受到广泛的青睐。本系统“基于Go语言的学生健康...