关于go module的使用

神奇的考拉 · · 1701 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

在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详解


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:神奇的考拉

查看原文:关于go module的使用

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1701 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传