目录

Go mod 模块化管理

前言

在Go语言的发展史中,2018年注定是一个重要的时间点,因为在8月正式发布了Go1.11。Go1.11语言部分虽然没有变化,但是带来了3个重量级的更新:一是amd64平台完全支持AVX512高性能的指令集;二是Go1.11开始支持模块化的特性;三是Go语言开始WebAssembly平台。这几个改进将成为后Go1时代最大的亮点。而模块是管理任何大型工程必备的工具,但是Go语言发布十年来一直缺乏官方的模块化工具。模块化的特性将彻底解决大型Go语言工程的管理问题,至此Go1除了缺少泛型等特性已经近乎完美。从Go1.13开始(2019年8月),模块化将成为默认的特性,彻底告别GOPATH时代;

使用

golang 1.11版本开启服务:set GO111MODULE=on,高于此版本不用开启

存在网络环境问题的可以设置代理:export GOPROXY=https://goproxy.io

取消代理(设置地址为空):export GOPROXY=

使用go mod 管理项目,就不需要非得把项目放到GOPATH指定目录下,你可以在任何目录下新建一个项目:

  • cd Desktop/test
  • go mod init // 初始化模块,会在项目根目录下生成 go.mod文件。
  • go mod tidy // 根据go.mod文件来处理依赖关系,生成go.sum文件
  • go mod vendor // 将依赖包复制到项目下的 vendor目录。强烈不推荐使用,建议使用被墙包实在无法下载的可以这么处理,方便用户快速使用命令go build -mod=vendor编译
  1. go.mod 文件必须要提交到git仓库,但 go.sum 文件可以不用提交到git仓库,go.sum 文件为包签名,跨平台条件下可能会报错;
  2. go 模块版本控制的下载文件及信息会存储到 GOPATH/pkg/mod 文件夹里,src 目录下不再存放包;
  3. 环境变量GOPATH不再用于解析imports包路径,即原有的GOPATH/src/下的包,通过import是找不到了。
  4. 旧版 go get 取包过程类似:git clone + go install , 开启Go Module功能后 go get 只有 git clone(download)过程了。老的go get取完主包后,会对其repo下的submodule进行循环拉取。新的go get不再支持submodule子模块拉取。

版本问题

在执行编译指令 go build/run 或 go mod tidy 后会根据 import 的包自动索引,但是部分包的 import 路径已经改变,如:echo 的 import “github.com/labstack/echo/"索引的包最高为 v3 版本,import “github.com/labstack/echo/v4”为echo 的v4版本。