Go Modules 包管理工具介绍

发布时间: 更新时间: 总字数:1217 阅读时间:3m 作者: IP上海 分享 网址

go modules 是官方推出的依赖管理工具,go modules 本质是一种 GOPATH 之外包管理工具。出现的目的是替代 go dep 时代

介绍

优点:

  • 代码不用放置在 $GOPATH 目录下
    • go mod 不再依靠 $GOPATH,使得它可以脱离 $GOPATH 来创建项目
  • 自动下载依赖管理
  • 支持版本控制
  • 支持 replace 机制,替代被墙的包

启用 Go modules 只需要执行:

go mod init <mod-name(project-url)>
// eg
go mod init github.com/xiexianbin/gseo

自动生成的文件如下:

  • go.mod 记录依赖
  • go.sum 依赖项描述文件,记录依赖的版本、校检和等
  • vendor 目录,存放依赖文件

go Module 的状态

Go modules 出现在 1.11 及其以上版本,1.13 已经默认开启 Go modules

  • GO111MODULE=off go 命令行将不会支持 module 功能
  • GO111MODULE=on go 命令行会使用 modules,而一点也不会去 GOPATH 目录下查找
  • GO111MODULE=auto 默认值,放在非 $GOPATH 目录下,且有 go.mod 文件时为 on,否则为 off

手动开启命令:

go env -w GO111MODULE=on
  • 其他相关概念
    • GONOPROXY
    • GONOSUMDB
    • GOPRIVATE

go.mod 关键字

module example.com/foobar

go 1.13

require (
    example.com/apple v0.1.2
    example.com/banana v1.2.3
    example.com/banana/v2 v2.3.4
    example.com/pineapple v0.0.0-20190924185754-1b0db40df49a
)

exclude example.com/banana v1.2.4
replace example.com/apple v0.1.2 => example.com/rda v0.1.0
replace example.com/banana => example.com/hugebanana
  • module:定义当前项目的模块名称
  • go:设置 Go 版本信息
  • require:设置特定的依赖包列表以及版本
  • exclude:从使用中排除一个特定的依赖包列表
  • replace:替换依赖包列表
    • 示例:
      • go mod edit -replace=golang.org/x/crypto=github.com/golang/crypto@latest
      • go mod edit -replace=gitee.com/openeuler/go-gitee=gitee.com/xiexianbin/go-gitee@latest,go.mod 中增加一行
replace gitee.com/openeuler/go-gitee => gitee.com/xiexianbin/go-gitee latest

Global Caching

go modules 中:

  • 同一模块、同一版本的数据只缓存一份,
    • 代码本地的缓存目录:$GOPATH/pkg/mod
    • sum db 的缓存目录:$GOPATH/pkg/sumdb

环境变量

  • GOINSECURE go1.14 引入的环境变量,指示 go 命令忽略 HTTPS 连接

命令

go help mod
Go mod provides access to operations on modules.

Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.

Usage:

	go mod <command> [arguments]

The commands are:

	download    download modules to local cache
	edit        edit go.mod from tools or scripts
	graph       print module requirement graph
	init        initialize new module in current directory
	tidy        add missing and remove unused modules
	vendor      make vendored copy of dependencies
	verify      verify dependencies have expected content
	why         explain why packages or modules are needed

Use "go help mod <command>" for more information about a command.

常用命令

  • go mod tidy //整理依赖,添加缺少的模块,移除不用的模块
  • go mod download //下载依赖包
  • go mod graph //打印模块依赖图
  • go mod vendor //将依赖复制到 vendor 下
  • go mod verify //校验依赖
  • go mod why //解释为什么需要依赖
  • go mod edit -replice=golang.org/x/crypto=github.com/golang/crypto@latest // 替换包地址
  • go list -m -json all //依赖详情

retract 版本过期声明

Go1.16 开始支持在 go.mod 文件中使用 retract 关键字声明版本过期,示例:

module github.com/xiexianbin/gseo

go 1.16
...

// 漏洞信息,会在 go get 时提示的哦
retract v1.0.0

// 或
retract (
  v1.0.0
  v1.0.1
)

在引用 v1.0.0/v1.0.1 会为有问题的版本显示提示

使用示例

初始化

# mkdir go-mod-demo && cd go-mod-demo
# go mod init go-mod-demo
go: creating new go.mod: module go-mod-demo
# ls
go.mod
# cat go.mod
module go-mod-demo

go 1.15

下载依赖

go mod vendor

升级依赖

  • go 命令
go list -mod=mod -u -m all
  • 或使用第三方工具 go-mod-upgrade 交互式地更新过时的 Go 依赖项。

  • 安装

$ go get -u github.com/oligot/go-mod-upgrade
  • 使用
$ go-mod-upgrade

说明:

  • green : minor update
  • yellow : patch
  • red : prerelease

其他

gopkg.in

gopkg.in 提供了版本化的 url,并包含适当的元数据,用于将 go 工具重定向到 GitHub 仓库,示例

gopkg.in/pkg.v3      -> github.com/go-pkg/pkg (branch/tag v3, v3.N, or v3.N.M)
gopkg.in/user/pkg.v3 -> github.com/user/pkg   (branch/tag v3, v3.N, or v3.N.M)

FAQ

golang dep 导入本地依赖库

目录结构如下:

# cd $GOPATH
# ls src/github.com/x-sso
golang-socials         golang-socials-example  # 需要引入本地 `github.com/x-sso/golang-socials` 的包

Gopkg.toml中添加:

ignored = ["github.com/x-sso/golang-socials/*"]

go.mod中添加:

replace github.com/x-sso/golang-socials => ../golang-socials

golang-socials目录中执行:

dep ensure -v
go mod vendor

go: verifying xxx: checksum mismatch

解决方式,删除 rm go.sum,重新执行 go mod tidy参考

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数