您的位置 首页 golang

go mod模块管理

gopath的基本理解

src:目录包含源代码。src下面的路径确定导入路径或可执行文件名。

pkg:目录包含已安装的包对象。每个目标操作系统和体系结构对都有自己的子目录pkg(pkg / GOOS_GOARCH)。

bin :目录保存已编译的命令。

Go搜索GOPATH中列出的每个目录以查找源代码,但新包始终下载到列表中的第一个目录中。

在1.11版本中,GOPATH不再用于解析。但仍然用于存储下载的源代码(在GOPATH / pkg / mod中)和编译的命令(在GOPATH / bin中)

go mod

go 1.11 有了对模块的实验性支持,大部分的子命令都知道如何处理一个模块,比如 run build install get list mod 子命令,第三方工具可能会支持的晚一些。到 go 1.12 会删除对 GOPATH 的支持,go get 命令也会变成只能获取模块,不能像现在这样直接获取一个裸包。可以用 环境变量 GO111MODULE 开启或关闭模块支持,它有三个可选值:off、on、auto,默认值是 auto。

GO111MODULE=off 无模块支持,go 会从 GOPATH 和 vendor 文件夹寻找包。

GO111MODULE=on 模块支持,go 会忽略 GOPATH 和 vendor 文件夹,只根据 go.mod 下载依赖。

GO111MODULE=auto 在 $GOPATH/src 外面且根目录有 go.mod 文件时,开启模块支持。

在使用模块的时候,GOPATH 是无意义的,不过它还是会把下载的依赖储存在 $GOPATH/pkg/mod 中,也会把 go install 的结果放在 $GOPATH/bin 中。

module机制由环境变量GO111MODULE控制,它有三个值:off、on、auto,默认值是auto。在auto模式下,在$GOPATH/src路径下build时,默认使用vendor、GOPATH导入第三方包,而在GOPATH之外编译时,默认使用go.mod设置导入项目。我们知道vendor机制只有在GOPATH路径之下才起作用,到了GOPATH之外就没用了。

定义模块

模块路径指模块根目录的导入路径,也是其他子目录导入路径的前缀。go.mod 文件第一行定义了模块路径,有了这一行才算作是一个模块。

go.mod 文件接下来的篇幅用来定义当前模块的依赖和依赖版本,也可以排除依赖和替换依赖。

module example.com/m

require (
 golang.org/x/text v0.3.0
 gopkg.in/yaml.v2 v2.1.0 
)

 replace  (
 golang.org/x/text =>  github .com/golang/text v0.3.0
)
 

go mod init example.com/m 生成 go.mod 的第一行

执行 go mod tidy 命令会根据需要的依赖自动生成 require 语句。

go get

go get 可以在末尾加 @ 符号,用来指定版本。它要求仓库必须用 v1.2.0 格式打 tag,像 v1.2 少个零都不行的,必须是语义化的、带 v 前缀的版本号。

go get github.com/gorilla/mux # 匹配最新的一个 tag
go get github.com/gorilla/mux@latest # 和上面一样
go get github.com/gorilla/mux@v1.6.2 # 匹配 v1.6.2
go get github.com/gorilla/mux@e3702bed2 # 匹配 v1.6.2
go get github.com/gorilla/mux@c856192 # 匹配 c85619274f5d
go get github.com/gorilla/mux@master # 匹配 master 分支
 

latest 匹配最新的 tag。
v1.2.6 完整版本的写法。
v1、v1.2 匹配带这个前缀的最新版本,如果最新版是 1.2.7,它们会匹配 1.2.7。
c856192 版本 hash 前缀、分支名、无语义化的标签,在 go.mod 里都会会使用约定写法 v0.0.0-20180517173623-c85619274f5d,也被称作伪版本。
go get 可以模糊匹配版本号,但 go.mod 文件只体现完整的版本号,即 v1.2.0、v0.0.0-20180517173623-c85619274f5d,只不过不需要手写这么长的版本号,用 go get 或上文的 go mod edit -require 模糊匹配即可,它会把匹配到的完整版本号写进 go.mod 文件。

使用流程

开启go module

set GO111MODULE=on //windows export GO111MODULE=on //linux

如果不是在gopath中使用 export GO111MODULE=auto

go mod init [module]

此命令会在当前目录中初始化和创建一个新的go.mod文件

go mod download

下载模块到本地 缓存 ,缓存路径是 $GOPATH/pkg/mod/cache

go mod graph

把模块之间的依赖图显示出

go mod tidy

增加缺失的包,移除没用的包。执行后会生成go.sum文件(模块下载条目) 自动维护require包版本控制

go mod vendor

**把依赖拷贝到 vendor/ ** go build -mod=vendor

go mod verify

检查当前模块的依赖是否已经存储在本地下载的源代码缓存中,以及检查自从下载下来是否有修改,删除不需要的依赖、新增需要的依赖,这个操作不会改变依赖版本。

go build go tidy go verify 都会自动维护require包版本控制

go mod edit -require=golang.org/x/net@v0.0.0

手动加入被墙的包(原始包),一定要记住版本号,实在不知道的话,就试试v0.0.0 版本可以通过执行go build 或者go tidy查看报错中版本号

go mod edit -replace=golang.org/x/net@v0.0.0=github.com/golang/net@latest

用新的包路径替换掉被墙的原始包,在这里新的包版本可以使用latest和master,这个有点人性了!

go mod edit -require 和 -replace 可以通过修改go.mod文件来做

关于科学的获取package

一些项目使用的包无法go get则需要找到github上进行替换

  1. 第一步使用go mod tidy 提示xxxx包找不到 例如 golang.org/x/crypto@v0.0.0-20181203042331-505ab145d0a9
  2. 使用github上的包,首先需要获取版本,通过go get -u github.com/golang/crypto 获取包

在go.mod文件中会出现如下类似的引用,前提是mod文件中不要有crypto的记录 require ( github.com/golang/crypto v0.0.0-20190219172222-a4c6cb3142f2 // indirect ) 我们记住github.com/golang/crypto v0.0.0-20190219172222-a4c6cb3142f2

  1. 在require中我们添加原来要引用的包 golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9
  2. 之后再replace中添加一行替换包的语句 golang.org/x/crypto => github.com/golang/crypto v0.0.0-20181001203147-e3636079e1a4
  3. 再次go mod tidy 就发现被墙的包替换为github的包了

简单粗暴的方案

GOPROXY设置下载的源,设置环境变量就ok

export GOPROXY=

export GOPROXY=

文章来源:智云一二三科技

文章标题:go mod模块管理

文章地址:https://www.zhihuclub.com/98818.shtml

关于作者: 智云科技

热门文章

网站地图