GOPATH
golang的包管理有些特别。go是以GOPAT环境变量中的目录去寻找包。相对于java,go并不会在当前目录下去寻找包。
于是,除非将当前工作目录加入到GOPATH环境变量中去,简单的以相对路径导入包是行不通的。传统做法是每次先将当前工作目录加入到GOPATH环境变量中。
例如
import (
"github.com/my/thing"
)
则必须将"github.com/my/thing"包加入到"GOPATH/github.com/my/thing"
目录下。这是比较麻烦的。
有没有更简单的方法呢?在Golang1.1.1版本后,便引入了go mod 包管理工具。
go mod
Module
模块(module)是一组相关go包的集合,被视为版本控制的单元。module中记录着依赖的包和相应的版本。
module 用项目根目录下go.mod 的文件记录。
一个go.mod文件事例:
module github.com/my/thing
require (
github.com/some/dependency v1.2.3
github.com/another/dependency/v4 v4.0.0
)
第一行表示项目本身的module路径。即使这个项目并不放在"GOPATH/github.com/my/thing"
目录,go仍然能根据go.mod正确导入相应包如github.com/my/thing/somepackage
进行编译。
使用go mod
init
最常用的就是go mod init,进入工作目录,使用
go mod init module-name
如:go mod init github.com/my/thing
根目录下就会多了go.mod文件。项目目录下多出一个文件 go.sum 。go.sum 包含所依赖的包的版本的校验和,起校验作用。
tidy
go mod tidy
可以移除go.mod文件中的无用依赖和添加缺失的依赖。
vendor
go mod vendor
此命令会将build阶段需要的所有依赖包放到模块所在的vendor目录中,并且测试所有模块的包。
Reference
- Go 1.11 Modules 官方说明文档 https://github.com/golang/go/wiki/Modules
- Go module的介绍及使用 https://blog.youkuaiyun.com/benben_2015/article/details/82227338