流逝的是岁月,不变的是情怀.
坚持学习,是为了成就更好的自己.
公众号[中关村程序员]

# Go Modules 和 goproxy.cn

# Go Module 概念

Modules 模块 module 是项目相关 Go 包的一个集合,它们作为一个独立单元将项目所需的依赖包版本化。

module 记录精确的依赖项并创建可重复的编译。

总结仓库,模块和包之间的关系:

  • 仓库包含一个或多个 Go 模块。
  • 每个模块包含一个或多个 Go 包
  • 每个包由一个目录中的一个或多个 Go 源文件组成 module 必须根据semver进行语义化版本,通常采用v(major).(minor).(patch)的形式,例如 v0.1.0,v1.2.3 或 v1.5.0-rc.1。

go.mod 模块由 Go 源文件树定义,并在源文件树的根目录中包含 go.mod 文件。模块源代码可能位于 GOPATH 之外。go.mod 文件有四个指令:module,require,replace,exclude。

这是一个定义模块github.com/my/thing的示例go.mod文件:

# 如何使用 Module

  1. 切换到 GOPATH 之外的目录:
$ cd <project path outside $GOPATH/src>         # cd ~/projects/hello
  • 需要注意的是,在 GOPATH 目录之外无需设置GO111MODULE环境变量来激活模块。
  • 或者,如果你想在 GOPATH 中运行:
$ export GO111MODULE=on                         # manually active module mode
$ cd $GOPATH/src/<project path>                 # cd $GOPATH/src/you/hello
  1. 初始化模块:
$ go mod init  

此步骤从现有的 dep Gopkg.lock 文件或其他九种支持的依赖文件(类似glide.lock详细戳),为 go.mod 添加 require 语句以匹配现有配置。

go mod init通常能够使用辅助数据(例如 VCS 元数据)来自动确定相应的模块路径,但是如果go mod init表明它不能自动确定模块路径,则你需要以其他方式覆盖 path,你可以提供模块路径作为go mod init的可选参数,例如:

$ go mod init github.com/my/repo
  1. 构建模块。在模块的根目录执行,./...模式匹配当前模块中的所有包。 go build 将根据需要自动添加没有的依赖项或未转换的依赖项
$ go build ./...
  1. 按配置测试模块,以确保它适用于所选版本:
$ go test ./...
  1. (可选)运行模块的测试以及所有直接和间接依赖项的测试以检查兼容性:
$ go test all
  • 一切都准备好了,但是go mod下载的包放在哪儿呢,因为我用的gvm。下面这个命令将会帮到你
go mod download -json

# go mod proxy

  • 在之前如果要下被墙的包需要配mirror,ss proxy等等各种手段,使用了module proxy之后,一切变得简单+ 起来。启用proxy只需两步
export GO111MODULE=on 
export GOPROXY=https://goproxy.cn
上次更新: 6/21/2023, 2:56:12 AM