关于go module的使用

在go1.11版本以后go modules成为了go官方的依赖管理方式,替换一起的Godep。使用go modules管理依赖后会在当前的项目根目录下生成go.mod和go.sum.

  • go.mod

    在其中记录当前的项目的所有依赖,文件格式如下:

    module go-demos
    
    go 1.13
    
    require github.com/x-mod/routine v1.2.7
    

    module go-demos
    
    go 1.13
    
    require (
          github.com/x-mod/routine v1.2.7
    )
    replace (  // 针对有些被墙不能下载 可以替换成其他依赖包
        golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
    )
    
  • go.sum

    在其中记录每个依赖库的版本和哈希值,文件格式如下:

    cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
    github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
    github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
    

一.启用go modules

1.1 要求

(1)go版本 >= 1.11 (1.11才添加的)

(2)设置GO111MODULE环境变量设置:

​ GO111MODULE用来开启go module。其有三个值:off/on/auto; off关闭go module,on开启go moudle,而auto则会根据当前工程project目录下是否有go.mod文件来判断是否使用modules功能。需要指出的无论go module处于哪种模式下,module功能都不会在GOPATH指定目录下查找依赖文件,故而尽量设置代理GOPROXY变量来保证使用go module能够确保依赖下载到。

​ 还有一点需要指出的,使用go module时,尽量手动设置GO111MODULE全局环境变量值为off,主要是为了兼容以前未使用go module项目引入go module。

echo export GO111MODULE=off >> ~/.bash_profile
或
直接在文件中手动设定

go mod命令:详情见go modules

download    下载依赖的module到本地cache
edit        编辑go.mod文件
graph       打印模块依赖图
init        在当前文件夹下初始化一个新的module, 创建go.mod文件
tidy        增加丢失的module,去掉未使用的module
vendor      将依赖复制到vendor下
verify      校验依赖
why         解释为什么需要依赖
二. 使用module

2.1 新建项目

$ export GO111MODULE=on
$ go mod init project目录(TestPro/github.com/XXX/TestPro)
......
$ go build //此时会将当前项目引用的依赖包括其依赖的依赖也会添加到go.mod中

2.2 已存在项目

$ export GO111MODULE=on
$ go mod init // 在当前project根目录下创建一个空的go.mod
$ go get 依赖  // 将当前项目中使用的依赖添加到go.mod中

需注意一点:go.mod是需要提交到代码仓库中的,而go.sum文件并不需要。

三. 打包

需要对前面已增加go module打包进行发布,此时要将当前项目需要的依赖下载到本地vendor目录。

### 指定打包生成的目标平台
export GO111MODULE="on" # 开启go module
export GOPROXY="https://mirrors.aliyun.com/goproxy/"#指定GOPROXY下载对应的依赖也可用replace替换
export CGO_ENABLED="0"  # 使用cgo
export GOOS="linux"     # 目标平台
export GOARCH=amd64     # 系统架构

go mod vendor  # 依赖下载到vendor目录
go build       # 构建
或
go build -ldflags "-s -w" -a -installsuffix cgo -o audit-webhook .

至此基本的go module已完成。

还有一些需要注意点:go module默认是不会在GOPATH下查找依赖文件的,其会在GOPATH/pkg/mod下查找有没有存在对应的依赖,没有则进行下载。也可以使用go mod download下载所需的依赖,默认会将依赖下载到GOPATH/pkg/mod下,这样其他的module就可以使用已缓存在本地的依赖。

四. 引用

官方modules

使用modules

跳出Go module的泥潭

Go Modules详解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,547评论 4 374
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,787评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,175评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,752评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,169评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,056评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,195评论 2 321
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,980评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,724评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,872评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,344评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,667评论 3 264
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,379评论 3 245
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,202评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,992评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,189评论 2 286
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,987评论 2 279