目录

文章目录

  • 目录
  • go mod 依赖包管理
  • 使用 go mod
  • go mod 的子指令

go mod 依赖包管理

Golang 将 Modules(模块)定义为 “源代码交付和版本控制的单元”。

go mod 是 Golang 1.11 版本引入的依赖包管理工具,替换旧的基于 GOPATH 的依赖包管理方式。GOPATH 不再需要包含 src 子目录,使用 go.mod 方式管理的依赖包都被下载到了 $GOPATH/pkg/mod 目录。

有了 go mod 之后,每个项目(源代码目录)就是一个 Module,只要其中包含了 go.mod 文件。go mod 指令和 go.mod 文件用于记录和解析模块之间的依赖性。

go.mod 文件一旦创建后,它的内容将会被 go toolchain(工具链)完全掌控,比如:执行 go get、go build、go mod 等指令时,会自动修改和维护 go.mod 文件。

除了 go.mod 之外,go 指令还维护了一个 go.sum 文件,其中包含特定模块版本内容的加密哈希。go 指令使用 go.sum 文件来确保这些模块的哈希值,以确保项目所依赖的模块不会出现意外更改。

go.mod 和 go.sum 都应该应用于版本控制。 并且 go.sum 不需要手工维护,所以可以不用太关注。

使用 go mod

使用 Go Modules 需要配置 GO111MODULE 环境变量,GO111MODULE 有三个值:off、on 和 auto(默认值):

  • GO111MODULE=off:关闭 Go Modules,沿用旧版本的 GOPATH 方式,项目的依赖包依旧在 vendor 目录或者 $GOPATH/src 目录下进行查找。
  • GO111MODULE=on:开启 Go Modules,项目的依赖包记录在 go.mod 文件中。
  • GO111MODULE=auto:go 指令根据当前目录来决定是否启用 Modules 功能。
    • 当项目处于 GOPATH/src 内,则会使用 GOPATH/src 的依赖包。
    • 当项目处于 GOPATH/src 外,则使用 go.mod 里 require 声明的依赖包。

使用 go.mod 的流程:

  1. 在 $GOPATH/src 目录之外创建 Golang 项目。
  2. 初始化项目的 go.mod 文件。
$ go mod init <projectNmae>

注意,项目下属的子目录是不需要再次 init 的,整个项目的依赖都会组织在根目录的 go.mod 文件里。

  1. 导入外部包:
package mainimport ("fmt""github.com/gohouse/gorose"
)func main() {fmt.Println("hello world!")
}
  1. 运行程序时,会自动下载依赖包并更新 go.mod 文件:
$ go run hello.go
go: finding module for package github.com/gohouse/gorose
go: downloading github.com/gohouse/gorose v1.0.5
go: found github.com/gohouse/gorose in github.com/gohouse/gorose v1.0.5
go: finding module for package github.com/gohouse/converter
go: downloading github.com/BurntSushi/toml v0.3.0
go: downloading github.com/gohouse/converter v0.0.3
go: found github.com/gohouse/converter in github.com/gohouse/converter v0.0.3
go: downloading github.com/go-sql-driver/mysql v1.4.0
# command-line-arguments
./hello.go:5:5: imported and not used: "github.com/gohouse/gorose"
  1. 检查 go.mod 文件中自动更新的依赖清单:
module hellogo 1.14require (github.com/gohouse/converter v0.0.3 // indirectgithub.com/gohouse/gorose v1.0.5 // indirect
)

其中 require 是一个关键字,此外还有 module、replace 和 exclude:

  • module 语句:指定模块的名字(路径)。
  • require 语句:指定的依赖模块。
  • replace 语句:可以替换依赖项模块。
  • exclude 语句:可以忽略依赖项模块。

另外,上述的 v0.0.3 就是依赖包 converter 的版本。如果没有在 go.mod 指定版本,go 指令就会自动下载代码中的依赖的最新版本。否则,go 指令会根据 require 语句的路径和版本进行下载。指定版本时也可以用 latest,表示下载最新的版本。

replace 语句常用于依赖包实际路径变更的场景中,例如:

replace golang.org/x/text => github.com/golang/text latest

如此的,在这种情况下依赖包的维护会变得更简单。

还需要注意 go.mod 中的 module hello 这一条语句,因为当前项目已经不在 $GOPATH/src 内了,所以 module hello 标注了项目 “根” 的路径,以此来作为项目中其他包的根路径。

go mod 的子指令

  • 初始化一个 Module:
go mod init <project_name>
  • 下载项目依赖的 modules 到本地 Cache:
# 在项目目录下执行
go mod download

注:目前所有模块版本数据均缓存在 $GOPATH/pkg/mod 和 $GOPATH/pkg/sum 下。

  • 编辑 go.mod 文件,选项有 -json、-require 和 -exclude:
go mod edit
# e.g.
go mod edit -replace=golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest
  • 以文本模式打印模块需求图:
go mod graph
  • 删除错误或者不使用的 Modules:
go mod tidy
  • 生成 Vendor 目录:
go mod vendor
  • 验证依赖是否正确:
go mod verify
  • 查找依赖:
go mod why
  • 清理 Modules 缓存:
go clean -modcache

Go 语言编程 — go mod 依赖包管理相关推荐

  1. Go (Golang) 工具之依赖包管理工具goimports | Go语言规范-import规范(导入)排序 |GoLand:设置gofmt与goimports,保存时自动格式化代码

    文章目录 Go (Golang) 工具之依赖包管理工具goimports Go语言规范-import(导入)排序 什么是goimports 安装和使用 Golang 使用goimports unrec ...

  2. 正在或即将被使用的Go依赖包管理方法:Go Modules,Go 1.13的标准特性

    公众号原文地址:https://mp.weixin.qq.com/s/SGGV3tWEg5AAJ7I_FcK0cg 目录 目录 说明 初始化 依赖包的默认导入 依赖包的特定版本导入 查看已添加依赖 依 ...

  3. Go Modules依赖包管理与Go Modules实战

    目录 Go Modules依赖包管理 Go Modules 简介 Go 包管理的历史 Go1.5 版本前:GOPATH Go1.5 版本:Vendoring "百花齐放":多种 G ...

  4. Cocoa依赖包管理工具

    Carthage iOS 作为目前最大的移动端开发平台,开发者的生态环境也是非常繁荣.在 iOS 早期时候,开发者想要使用第三方库就必须将其源代码引入工程,或者说是以 git submodule 的形 ...

  5. Golang学习笔记之依赖包管理工具gvt

    一.gvt概念 gvt全称为Go vendoring tool,可译为Go供应工具,或者意译为Go依赖包依赖包工具,whatever~~,简单来说就是可以方便的获取.更新.删除项目所依赖的工具包,这个 ...

  6. 前端依赖包管理-bower

    下面的内容浅显易懂,适合初级前端工程师观看 此篇主要内容是讲,如何使用WebStorm控制台下载.删除依赖包,和npm,bower一些指令的使用方法. 学习这篇文章前,需要将node.js先安装好. ...

  7. Golang 依赖包管理工具---glide

    安装glide $ go get github.com/Masterminds/glide $ go install github.com/Masterminds/glide 验证 $ glide N ...

  8. ubuntu 缺少php安装包,ubuntu 16.04 lts安装php环境和composer依赖包管理

    安装环境 1.安装之前先更新系统 1 sudo apt update 2.安装Apache2 1 sudo apt install apache2 3.安装PHP 1 sudo apt install ...

  9. python 依赖包管理_依赖管理

    如果我们的项目依赖第三方的jar包,例如commons logging,那么问题来了:commons logging发布的jar包在哪下载? 如果我们还希望依赖log4j,那么使用log4j需要哪些j ...

最新文章

  1. 2022-2028年中国PVC糊树脂行业市场深度分析及市场规模预测报告
  2. LeetCode--014--最长公共前缀(java)
  3. [YTU]_1063 (输入三个整数,按由小到大的顺序输出)
  4. python opencv 官方文档里LaTeX公式不能正常显示怎么办?
  5. STM32开发 -- 进制与字符串间的转换
  6. 如何使用Fescar保证Dubbo微服务间的一致性
  7. 淘宝登货员1.02(重要升级)
  8. 如何自己研究SAP Cloud for Customer的订单类型设计
  9. 《剑指Offer》62:圆圈中最后剩下的数字(约瑟夫环)
  10. Thread类中的常用方法
  11. 吝啬SAT问题是NP完全问题的证明
  12. 选中的磁盘具有MBR分区表,在EFI系统上,windows只能安装到GPT磁盘
  13. freeswitch的使用
  14. 论文笔记 PCL: Proposal Cluster Learning for Weakly Supervised Object Detection - TPAMI 2018
  15. (四)JMockit 的API:@Injectable 与 @Mocked的不同--基础篇
  16. HTML+CSS期末大作业:动漫网站设计——悬崖上的金鱼姬(5页) / 动漫网页设计作业,网页设计作业 / 动漫网页设计成品 学生DW网页设计作业成品 web课程设计网页规划与设计...
  17. 如何在 LaTeX 中输入角度、角分、角秒?
  18. EasyAR 插件使用简介
  19. Essential Phone PH1 刷 Android 9.0的方法
  20. 电磁感应、电感与变压器

热门文章

  1. iOS 9音频应用播放音频之iOS 9音频播放进度
  2. ​Unity 游戏开发技巧集锦之制作一个望远镜与查看器摄像机
  3. 搭建渗透测试环境选自KaliLinux无线网络渗透测试教程
  4. ubuntu20输入法qiehuan_ubuntu20.04中文输入法安装步骤
  5. mysql主主和F5高可用_MYSQL 主主热备高可用方案与实现
  6. 研究人员探索gaze fixation对基于运动想象的脑机接口性能的影响
  7. 首个获得FDA批准的脑机接口设备:“突破性”脑机接口设备用于造福人类
  8. php sql alert,SQL ALTER
  9. mysql100万数据一键下载csv_使用PHP来导入包含100万条数据的csv文件,请问你最快多久能全部导入mysql 数据库?...
  10. 菲尔兹奖得主舒尔茨没做到的事,现在被计算机证明了