igozhang

——

    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 以及版本.
    

    MP3