go modules 是 golang 1.11 新加的特性。现在1.12 已经发布了,是时候用起来了。Modules官方定义为:

模块是相关Go包的集合。modules是源代码交换和版本控制的单元。
go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。

如何使用 Modules ?

  • 把 golang 升级到 1.11(现在1.12 已经发布了,建议使用1.12)
  • 设置 GO111MODULE

GO111MODULE

GO111MODULE 有三个值:off, on和auto(默认值)。

  • GO111MODULE=off,无模块支持,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
  • GO111MODULE=on,模块支持,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
  • GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。
    这种情况下可以分为两种情形:
    1.当前目录在GOPATH/src之外且该目录包含go.mod文件,开启模块支持。
    2.当前文件在包含go.mod文件的目录下面。

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

当modules 功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的module。

go mod
golang 提供了 go mod命令来管理包。

go mod 有以下命令:

命令        说明
download :download modules to local cache(下载依赖包,下载依赖的module 到本地cache)edit:  edit go.mod from tools or scripts(编辑go.mod文件)graph:print module requirement graph (打印模块依赖图)init:initialize new module in current directory(在当前目录初始化mod,在当前文件夹下初始化一个新的module,创建 go.mod 文件)tidy:add missing and remove unused modules(拉取缺少的模块,移除不用的模块)vendor:make vendored copy of dependencies(将依赖复制到vendor下)verify:verify dependencies have expected content (验证依赖是否正确)why:explain why packages or modules are needed(解释为什么需要依赖)
go mod vendor 命令可以在项目中创建vendor 文件将依赖包拷贝过来。
go mod download 命令用于将依赖包缓存到本地Cache起来。
go list -m -json all :显示所有import库信息:-json :JSON格式显示,all:显示全部库
Mod Cache 路径:默认在$GOPATH/pkg 下面:$GOPATH/pkg/mod

如何在项目中使用
示例一:创建一个新项目

  1. 在GOPATH 目录之外新建一个目录,并使用go mod init 初始化生成go.mod 文件,go.mod中会列出所有依赖包的路径和版本。
➜  ~ mkdir hello
➜  ~ cd hello
➜   go mod init hello
go: creating new go.mod: module hello
➜ ls
go.mod
➜   cat go.mod
module hellogo 1.12

go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。

go.mod 提供了module, require、replace和exclude 四个命令

module 语句指定包的名字(路径)
require 语句指定的依赖项模块
replace 语句可以替换依赖项模块
exclude 语句可以忽略依赖项模块
  1. 添加依赖
    新建一个 server.go 文件,写入以下代码:
package mainimport ("net/http""github.com/labstack/echo"
)func main() {e := echo.New()e.GET("/", func(c echo.Context) error {return c.String(http.StatusOK, "Hello, World!")})e.Logger.Fatal(e.Start(":1323"))
}

执行 go run server.go 运行代码会发现 go mod 会自动查找依赖自动下载:

现在查看go.mod 内容:

$ cat go.modmodule hellogo 1.12require (github.com/labstack/echo v3.3.10+incompatible // indirectgithub.com/labstack/gommon v0.2.8 // indirectgithub.com/mattn/go-colorable v0.1.1 // indirectgithub.com/mattn/go-isatty v0.0.7 // indirectgithub.com/valyala/fasttemplate v1.0.0 // indirectgolang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a // indirect
)

// indirect 表示这个库是间接引用进来的。

go module 安装 package 的原則是先拉最新的 release tag,若无tag则拉最新的commit, go 会自动生成一个 go.sum 文件来记录 dependency tree:

$ cat go.sum
github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0=
github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
... 省略很多行
  1. 再次执行脚本 go run server.go 发现跳过了检查并安装依赖的步骤。
  2. 可以使用命令 go list -m -u all 来检查可以升级的package,使用go get -u need-upgrade-package 升级后会将新的依赖版本更新到go.mod * 也可以使用 go get -u 升级所有依赖

go get 升级

运行 go get -u 将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
运行 go get -u=patch 将会升级到最新的修订版本
运行 go get package@version 将会升级到指定的版本号version
运行go get如果有版本的更改,那么go.mod文件也会更改

示例二:改造现有项目(helloword)
项目目录为:

$ tree
.
├── api
│   └── apis.go
└── server.go1 directory, 2 files

server.go 源码为:

package mainimport (api "./api"  // 这里使用的是相对路径"github.com/labstack/echo"
)func main() {e := echo.New()e.GET("/", api.HelloWorld)e.Logger.Fatal(e.Start(":1323"))
}

api/apis.go 源码为:

package apiimport ("net/http""github.com/labstack/echo"
)func HelloWorld(c echo.Context) error {return c.JSON(http.StatusOK, "hello world")
}
  1. 使用 go mod init *** 初始化go.mod
$ go mod init helloworld
go: creating new go.mod: module helloworld
  1. 运行 go run server.go
go: finding github.com/labstack/gommon/color latest
go: finding github.com/labstack/gommon/log latest
go: finding golang.org/x/crypto/acme/autocert latest
go: finding golang.org/x/crypto/acme latest
go: finding golang.org/x/crypto latest
build command-line-arguments: cannot find module for path _/home/gs/helloworld/api

首先还是会查找并下载安装依赖,然后运行脚本 server.go,这里会抛出一个错误:

build command-line-arguments: cannot find module for path _/home/gs/helloworld/api

但是go.mod 已经更新:

$ cat go.mod
module helloworldgo 1.12require (github.com/labstack/echo v3.3.10+incompatible // indirectgithub.com/labstack/gommon v0.2.8 // indirectgithub.com/mattn/go-colorable v0.1.1 // indirectgithub.com/mattn/go-isatty v0.0.7 // indirectgithub.com/valyala/fasttemplate v1.0.0 // indirectgolang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a // indirect
)

那为什么会抛出这个错误呢?
这是因为 server.go 中使用 internal package 的方法跟以前已经不同了,由于 go.mod会扫描同工作目录下所有 package 并且变更引入方法,必须将 helloworld当成路径的前缀,也就是需要写成 import helloworld/api,以往 GOPATH/dep 模式允许的 import ./api 已经失效,详情可以查看这个 issue。

更新旧的package import 方式

所以server.go 需要改写成:

package mainimport (api "helloworld/api"  // 这是更新后的引入方法"github.com/labstack/echo"
)func main() {e := echo.New()e.GET("/", api.HelloWorld)e.Logger.Fatal(e.Start(":1323"))
}

一个小坑:开始在golang1.11 下使用go mod 遇到过 go build github.com/valyala/fasttemplate: module requires go 1.12 这种错误,遇到类似这种需要升级到1.12 的问题,直接升级golang1.12 就好了。幸亏是在1.12 发布后才尝试的go mod

go mod 使用 + GO111MODULE相关推荐

  1. 3.0 go mod之远程仓库搭建-代码示例

    注意事项 所谓的远程仓库指的是github,个人首次使用go mod在其他云仓库上尝试,并未成功,这浪费了我近2小时的时间: 如果你是初次尝试,那么除了github的地址换一下之外,其他的都按照示例操 ...

  2. Go-包管理(管理工具对比及go mod的使用)

    目录 GOPATH go install命令 govendor go mod 配置 GO111MODULE介绍 命令 使用 GOPROXY介绍 项目目录 代码 运行截图 远程包 go get命令 参考 ...

  3. fossa介绍和使用

    1.介绍 开源是您软件的重要组成部分.在一般的现代软件产品中,超过 80% 的源代码来自开源.每个组件都可能对您的客户产生级联的法律.安全和质量影响,使其成为正确管理的最重要的事情之一. FOSSA ...

  4. Go语言的依赖解决方案Go modules(go.mod、go mod)、Goland使用Go mod模式创建工程、GO111MODULE

    文章目录 一.关于Go modules 1. GOPATH 2. 为什么弃用 GOPATH 模式 3. Go Modules基本使用(Go mod 使用记录) 4. Go modules 中常用环境变 ...

  5. go build不从本地gopath获取_Go包管理GOPATH、vendor、go mod机制

    简介 Golang 作为开源编程语言,在 2012 年编程语言 Go 1 发布之后,一直在不断发展,并伴随着云原生而广泛进入各大公司. 在互联网发展至今,软件系统不断膨胀. 各个编程语言也都逐步支持了 ...

  6. Go 语言编程 — go mod 依赖包管理

    目录 文章目录 目录 go mod 依赖包管理 使用 go mod go mod 的子指令 go mod 依赖包管理 Golang 将 Modules(模块)定义为 "源代码交付和版本控制的 ...

  7. go mod tidy 下载依赖包问题

    go: golang.org/x/sys@v0.0.0-20190813064441-fde4db37ae7a: unrecognized import path "golang.org/x ...

  8. goland 创建工程(go mod)singo

    创建 选择 go modules 方式 创建成功,但是你发现这个文件里面只有 go.mod, 我的vendor文件呢?不管了,继续搞 用橙大大的singo试试 $ git clone https:// ...

  9. golang mod 包管理使用 引入本地包

    对于多个项目来说,把所有的源码都放在GOPATH下的src目录下非常的不方便.golang给我们提供了一个叫go mod的命令来脱离src目录,方便我们管理go项目. 对于windows用户来说,使用 ...

最新文章

  1. Open3d 学习计划—12(Jupyter 可视化)
  2. Android项目中创建编译期的注解
  3. 4K60帧视频实时抠图,连头发丝都根根分明
  4. 编辑器 Notepad++
  5. 首届全球互联网通信云大会重磅来袭 融云邀您洞见通信未来
  6. 现在竟然还有补丝袜的?
  7. 神经网络中BP(back propagation)到底在干些什么
  8. 关于信贷资产逾期计算口径和小微模型的经典问题与答案
  9. 你有哪些“相见恨晚”的 UE4 学习资料?
  10. 【NOI2002】【Luogu1196】银河英雄传说(并查集带边权)
  11. java+switch语句+枚举,Java枚举类型在switch语句中的正确用法
  12. 向量场_方向向量和梯度
  13. html 图片导出excel,html静态表格导出到excel
  14. 仿今日头条小程序搭建
  15. github gitee 仓库大小限制 单个文件大小限制
  16. 如何一键查询名下所有银行卡?
  17. 什么是设备管理系统,包括哪些内容?一文读懂
  18. 【AGC035F】Two Histograms
  19. 软件系统——需求调研
  20. python语言arrows用法_python时区运算,时区,时间戳,夏令时讲解

热门文章

  1. 中国空中交通管理系统行业发展新局面及十四五发展趋势报告2021-2027年
  2. chrome操作系统_如何报告问题或发送有关Chrome操作系统的反馈
  3. catv系统主要有哪三部分组成_数控系统主要由哪几部分组成
  4. xshell连接不上虚拟机问题,前提:虚拟机和主机能ping通
  5. Spring boot 线程池之单线程问题
  6. [IT生活推荐]大家一起来玩游戏喽,来的都进!
  7. 外语学习强烈推荐Rosetta Stone
  8. windows md5sum
  9. SAP:不一样的2019?
  10. 【货干】强制删除文件夹/文件