Go 语言编程 — go mod 依赖包管理

举报
云物互联 发表于 2021/08/06 01:42:51 2021/08/06
【摘要】 目录 文章目录 目录go mod 依赖包管理使用 go modgo mod 的子指令 go mod 依赖包管理 Golang 将 Modules(模块)定义为 “源代码交付和版本控制的单元”。 go mod 是 Golang 1.11 版本引入的依赖包管理工具,替换旧的基于 GOPATH 的依赖包管理方式。GOPATH 不再需要包含 src 子目录,...

目录

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>

  
 
  • 1

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

  1. 导入外部包:
package main

import (
	"fmt"
	"github.com/gohouse/gorose"
)

func main() {
	fmt.Println("hello world!")
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. 检查 go.mod 文件中自动更新的依赖清单:
module hello

go 1.14

require (
	github.com/gohouse/converter v0.0.3 // indirect
	github.com/gohouse/gorose v1.0.5 // indirect
)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

其中 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

  
 
  • 1

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

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

go mod 的子指令

在这里插入图片描述

  • 初始化一个 Module:
go mod init <project_name>

  
 
  • 1
  • 下载项目依赖的 modules 到本地 Cache:
# 在项目目录下执行
go mod download

  
 
  • 1
  • 2

注:目前所有模块版本数据均缓存在 $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

  
 
  • 1
  • 2
  • 3
  • 以文本模式打印模块需求图:
go mod graph

  
 
  • 1
  • 删除错误或者不使用的 Modules:
go mod tidy

  
 
  • 1
  • 生成 Vendor 目录:
go mod vendor

  
 
  • 1
  • 验证依赖是否正确:
go mod verify

  
 
  • 1
  • 查找依赖:
go mod why

  
 
  • 1
  • 清理 Modules 缓存:
go clean -modcache

  
 
  • 1

文章来源: is-cloud.blog.csdn.net,作者:范桂飓,版权归原作者所有,如需转载,请联系作者。

原文链接:is-cloud.blog.csdn.net/article/details/108022989

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。