GoModule_CRUD

GoModule_CRUD

1.添加依赖
2.升级 / 降级依赖的版本
3.添加一个主版本号大于 1 的依赖
4.升级依赖版本到一个不兼容版本
5.移除一个依赖
6.使用vendor

1.添加依赖

代码:

package main

import (
  "github.com/google/uuid"
  "github.com/sirupsen/logrus"
)

func main() {
  logrus.Println("hello, go module mode")
  logrus.Println(uuid.NewString())
}

源码中,通过 import 语句导入了 github.com/google/uuid,并在 main 函数中调用了 uuid 包的函数 NewString。

添加依赖包:
$go get github.com/google/uuid
或者
$go mod tidy
2.升级 / 降级依赖的版本

假设go mod tidy 命令选择了 logrus 的最新发布版本 v1.8.1。如果需要将 logrus 版本降至某个之前发布的兼容版本,比如 v1.7.0

GoModule_降级:
$go get github.com/sirupsen/logrus@v1.7.0
go: downloading github.com/sirupsen/logrus v1.7.0
go get: downgraded github.com/sirupsen/logrus v1.8.1 => v1.7.0

也可以:
$go mod edit -require=github.com/sirupsen/logrus@v1.7.0
$go mod tidy       
go: downloading github.com/sirupsen/logrus v1.7.0

GoModule升级:

假设logrus v1.7.1修复了安全漏洞,我们需要升级

$go get github.com/sirupsen/logrus@v1.7.1
go: downloading github.com/sirupsen/logrus v1.7.1
go get: upgraded github.com/sirupsen/logrus v1.7.0 => v1.7.1
3.添加一个主版本号大于 1 的依赖

在 Go Module 构建模式下,当依赖的主版本号为 0 或 1 的时候,我们在 Go 源码中导入依赖包,不需要在包的导入路径上增加版本号:

import github.com/user/repo/v0 等价于 import github.com/user/repo
import github.com/user/repo/v1 等价于 import github.com/user/repo

如果我们要为项目引入主版本号大于 1 的依赖,比如 v2.0.0,那么由于这个版本与 v1、v0 开头的包版本都不兼容,我们在导入时,不能再使用 github.com/user/repo,而要使用像下面代码中那样不同的包导入路径:

import github.com/user/repo/v2/xxx


示例:
(以空导入的方式导入v7版本的github.com/go-redis/redis包)


package main

import (
  _ "github.com/go-redis/redis/v7" // “_”为空导入
  "github.com/google/uuid"
  "github.com/sirupsen/logrus"
)

func main() {
  logrus.Println("hello, go module mode")
  logrus.Println(uuid.NewString())
}


$go get github.com/go-redis/redis/v7
go: downloading github.com/go-redis/redis/v7 v7.4.1
go: downloading github.com/go-redis/redis v6.15.9+incompatible
go get: added github.com/go-redis/redis/v7 v7.4.1
4.升级依赖版本到一个不兼容版本(主版本号不一致)

示例:
(redis从V7升级到V8)

4.1 改代码里倒入路径的版本号

import (
  _ "github.com/go-redis/redis/v8"
  "github.com/google/uuid"
  "github.com/sirupsen/logrus"
)

4.2  go get

$go get github.com/go-redis/redis/v8
go: downloading github.com/go-redis/redis/v8 v8.11.1
go: downloading github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f
go: downloading github.com/cespare/xxhash/v2 v2.1.1
go get: added github.com/go-redis/redis/v8 v8.11.1
5.移除一个依赖

示例:
(移除redis)

5.1
移除代码中的go-redis/redis,然后go build 项目,会发现
go.mod 的require字段以及
go list -m all 列出所有依赖
redis均继续存在

5.2
go mod tidy
将这个依赖项彻底从 Go Module 构建上下文中清除掉。go mod tidy 会自动分析源码依赖,而且将不再使用的依赖从 go.mod 和 go.sum 中移除。
6.使用vendor

vendor 机制虽然诞生于 GOPATH 构建模式主导的年代,但在 Go Module 构建模式下,它依旧被保留了下来,并且成为了 Go Module 构建机制的一个很好的补充。特别是在一些不方便访问外部网络,并且对 Go 应用构建性能敏感的环境,比如在一些内部的持续集成或持续交付环境 (CI/CD) 中,使用 vendor 机制可以实现与 Go Module 等价的构建。和 GOPATH 构建模式不同,Go Module 构建模式下,我们再也无需手动维护 vendor 目录下的依赖包了,Go 提供了可以快速建立和更新 vendor 的命令,我们还是以前面的 module-mode 项目为例,通过下面命令为该项目建立 vendor:


$go mod vendor
$tree -LF 2 vendor
vendor
├── github.com/
│   ├── google/
│   ├── magefile/
│   └── sirupsen/
├── golang.org/
│   └── x/
└── modules.txt

go mod vendor 命令在 vendor 目录下,创建了一份这个项目的依赖包的副本,并且通过 vendor/modules.txt 记录了 vendor 下的 module 以及版本.
Avatar photo
igoZhang

互联网应用,虚拟化,容器

评论已关闭。