3.4 Go语言从入门到精通:包管理工具之Go module

Go modules 是 Go 语言目前最佳的依赖解决方案,发布于 Go 1.11版本,Go1.14版本 上已经明确建议生产上使用。而 Go modules 之前,Go 项目使用 GOPATH 、Govendor包管理方式,但却都存在一定的问题,本文就重点讨论关于另外一个包管理工具 Go module 的由来及使用。
1、Go module 概述
1.1 Go module介绍

使用 GOPATH 包管理方式,最严重的问题就是当使用go get 命令时,没有版本选择机制,拉取下来的依赖代码都会默认当前最新版本,而且如果当项目 A 和项目 B 分别依赖项目 C 的两个不兼容版本时, GOPATH 路径下只有一个版本,则 C 将无法同时满足 A 和 B 的依赖需求。这可以说是一个很大的缺陷了,因而 Go 1.13版本 起,官方就不再推荐使用 GOPATH 方式了。

随着 Go 语言使用人数的增长,依赖包的丰富,依赖版本问题尤其严重。

于是 Go 官方在 Go 1.5版本的时候提出了实验性质的 vendor 机制:每个项目都可以有一个vendor/ 目录来存放项目所需版本依赖的拷贝。

社区中基于官方给的机制,开发出了各种版本管理工具。比较流行的比如 govendor,以及之前曾被官方认定的 godep 工具等。

这些工具的思路基本都是为每个项目单独维护一份对应版本依赖的拷贝。

管理工具虽然丰富了起来,但是不同版本工具之间不兼容,无法协作,各种工具还都有学习成本。这时候在 Go 官方扶持下成立的 dep 项目被大家认为是未来一统江湖的版本管理工具,被称作 official experiment。

dep 采用了和 Rust 的管理工具 Cargo 类似的管理模式,原理在此不深究。

没过多久,Go 社区的核心人物 rsc 提出了 vgo 方案。一时间竟然出现了两个所谓的 Go 官方的版本管理方案。最终官方采用了 vgo 方案,随着 vgo 的逐渐成熟,Go 1.11版本发布了该功能,并集成到了 Go 的官方工具中,也就是当前的 Go modules。

Go module 是Go语言从 1.11 版本之后官方推出的版本管理工具,并且从 Go 1.13 版本开始,Go module 成为了Go 语言默认的依赖管理工具。

Modules 官方定义为:

Modules 是相关 Go 包的集合,是源代码交换和版本控制的单元。Go 语言命令直接支持使用 Modules,包括记录和解析对其他模块的依赖性,Modules 替换旧的基于 GOPATH 的方法,来指定使用哪些源文件。
1.2 Go module 常用命令
3.4 Go语言从入门到精通:包管理工具之Go module2、快速入门
2.1 设置环境变量

要使用 Go module 必须确保 Go 版本在1.11之上。

设置 GO111MODULE

在Go 1.12 版本之前,要启用 go module 工具首先要设置环境变量 GO111MODULE,不过在Go 1.13及以后的版本,则不再需要设置环境变量。通过 GO111MODULE 可以开启或关闭 go module 工具。

GO111MODULE=off 禁用 go module,编译时会从 GOPATH 和 vendor 文件夹中查找包。
GO111MODULE=on 启用 go module,编译时会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod下载依赖。
GO111MODULE=auto(默认值),当项目在 GOPATH/src 目录之外,并且项目根目录有 go.mod 文件时,开启 go module。

Window:

set GO111MODULE=on
// 或者
set GO111MODULE=auto

MacOS 或 Linux:

export GO111MODULE=on
// 或者
export GO111MODULE=auto

2.2 项目初始化

在 GOPATH 目录之外新建一个目录,并使用 go mod init 初始化生成 go.mod 文件。

E:\github\golangLearning>go mod init golangLearning
go: creating new go.mod: module golangLearning
go: to add module requirements and sums:
go mod tidy

初始化生成的 go.mod 文件如下所示:

module golangLearning

go 1.16

更多请见:http://www.mark-to-win.com/tutorial/50509.html

上一篇:Verilog HDLBits 第十四期:3.2.4 More Circuits


下一篇:centOS 6.4 vsftpd 500 illegal port command