Go 学习笔记 - module

发表信息: by

Go 学习笔记 - module

1 介绍

go module 是 go 1.11 官方推出的版本管理工具,go 1.13 版本开始,go module 是go语言默认的依赖管理工具。

2. 启用

启用 go module 需要先设置环境变量 GO111MODULE ,通过它开启/关闭 模块支持,可选值: off, on, auto , 默认是 auto

  1. GO111MODULE=off 禁用模块支持,编译时候会从 GOPATHvender 中查找包
  2. GO111MODULE=on 开启模块支持,编译时只根据 go.mod 下载依赖,并保存到 %GOPATH%/pkg/mod 目录下
  3. GO111MODULE=auto ,当项目在根目录下存在go.mod 的时候,开启。

使用 go module 管理依赖后,会生成两个文件,go.modgo.sum

go 1.11 之后,设置 GOPROXY 的命令为: export GOPROXY=https://goproxy.cn

go 1.13 之后GOPROXY默认值为https://proxy.golang.org,在国内是无法访问的,推荐使用goproxy.cngo env -w GOPROXY=https://goproxy.cn,direct

3. GO MOD

go mod 命令如下:

  • go mod download 下载依赖的module到本地cache,默认 $GOPATH/pkg/mod
  • go mod edit 编辑 go.mod 文件
  • go mod graph 打印依赖图
  • go mod init 初始化项目,创建go.mod
  • go mod tidy 下载缺少的依赖, 并将无用依赖删除掉
  • go mod vendor 将依赖复制到vendor下
  • go mod verify 校验依赖
  • go mod why 解释为什么需要依赖
  • go mod edit 可以修改 go.mod 文件,并且 go mod edit -fmt 可以格式化文件内容
  • go mod edit -require=golang.org/x/text 可以添加依赖
  • go mod edit -droprequire=golang.org/x/text 可以删除依赖
  • go help mod edit 可以查看帮助

go mod 文件内容

module github.com/Q1mi/studygo/blogger

go 1.12

require (
    github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
    github.com/gin-gonic/gin v1.4.0
    github.com/go-sql-driver/mysql v1.4.1
    github.com/jmoiron/sqlx v1.2.0
    github.com/satori/go.uuid v1.2.0
    google.golang.org/appengine v1.6.1 // indirect
)
  • module 是包名
  • require 用来定义依赖包 和 版本
  • indirect 表示间接引用

4. GO GET

依赖包版本可以是git分之的tag,也可以是commit hash,支持如下几种格式。

go get gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
go get gopkg.in/vmihailenco/msgpack.v2 v2.9.1
go get gopkg.in/yaml.v2 <=v2.2.1
go get github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
latest

go get 可以下载依赖包,并且还可以指定版本:

  1. go get -u 会将升级到最新的次要版本或者修订版本
  2. go get -u=patch 会升级到最新的修订版本
  3. go get package@version 将会升级到指定版本

5. 在项目中使用 go module

  1. 既有项目启用 go module, go mod init 生成 go.mod 文件, go get 开始下载依赖包,并且生成 go.sum 依赖文件
  2. 新项目,go mod init 项目名 再当前项目文件下创建一个 go.mod 文件,手动编辑 go.mod 或者执行 go get 来进行依赖。

5.1 包和调用文件在同一项目下

例如:

moduledemo
├── go.mod
├── main.go
└── mypackage
    └── mypackage.go  // package mp 定义包名为 mp

步骤:

  1. 在项目下创建一个go.mod 文件
  2. go.mod 文件下添加
    module moduledemo  // 设定 moduledemo 为包根目录名,可以随意改变该名字,只需要导入时一致就好
    go 1.14  // 表明版本
    
  3. 导入想要的包文件
    import "moduledemo/mypackage"  // 这里是导入包目录下的包文件名
    
  4. 使用包文件
    mp.MyPackage()  // 使用包中的 MyPackage() 函数
    

5.2 包和被调用文件不在同一个项目下

例如:

├── moduledemo
│   ├── go.mod
│   └── main.go
└── mypackage
    ├── go.mod
    └── mypackage.go  // package mp 定义包名为 mp

步骤:

  1. mypackage. 下面创建 go.mod 文件,并添加下面代码
    module mypackage
    go 1.14
    
  2. moduledemo 下面创建 go.mod 文件,并添加下面代码
    module moduledemo
    go 1.14
    require mypackage v0.0.0  // 这个会在你执行 go build 之后自动在该文件添加
    replace mypackage => ../mypackage  // 指定需要的包目录去后面这个路径中寻找
    
  3. 导入和使用
    import "mypackage"  // 因为该包目录本身就是包文件所以无需添加下一级路径
    mp.MyPackage()  // 使用包中的 MyPackage() 函数