Go Modules介绍

为了解决Go包管理的问题,Go从1.11开始加入了Go Modules这一新特性。让包的依赖和版本管理更加容易。

一个module可以理解为一个单独的包或者模块,module的根目录下会包含一个go.mod文件。go.mod文件中定义了该module被其它包importpath,同时也包含了该module中依赖哪些包,和这些包的版本号。

Go 1.11需要设置GO111MODULE来开启module功能
GO111MODULE=on,会开启使用module
GO111MODULE=auto默认值,会根据当前目前来决定是否开启module。如果当前目录在``GOPATH/src``之外且当前目录有``go.mod``文件或当前文件在包含go.mod文件的目录下面
从Go 1.13开始module被默认开启

创建一个module

GOPATH/src之外创建一个空的文件夹hello,打开这个文件夹,创建一个hello.go文件:

package hello

func Hello() string {
return "Hello, world."
}

写一个单测文件hello_test.go

package hello

import "testing"

func TestHello(t *testing.T) {
want := "Hello, world."
if got := Hello(); got != want {
t.Errorf("Hello() = %q, want %q", got, want)
}
}

运行go test命令,这个时候返回:

PS D:\Code\hello> go test
PASS
ok _/D_/Code/hello 0.176s

可以看到当前的目录是在D:\Code\hello,既不是在GOPATH/src目录下,这时也不是一个module,但是go命令创造了一个假的module名称是:_/D_/Code/hello

我们这时运行go mod init 命令,创建一个module并且运行单测:

go mod init example.com/hello
go: creating new go.mod: module example.com/hello go test
PASS
ok example.com/hello 0.177s

可以看到case运行通过,并且返回ok example.com/hello 0.177s 是我们刚才创建的module。在目录下面也可以看到通过go mod init 创建了一个go.mod文件内容是:

module example.com/hello

go 1.14

mod文件只需要在module的根目录下创建就行了,子目录的import path是module的path加上子目录的地址。

添加外部依赖

在hello.go文件中导入一个外部的包:

package hello

import "rsc.io/quote"

func Hello() string {
return quote.Hello()
}

运行单测:

go: finding module for package rsc.io/quote
go: found rsc.io/quote in rsc.io/quote v1.5.2
--- FAIL: TestHello (0.00s)
hello_test.go:8: Hello() = "你好,世界。", want "Hello, world."
PASS
ok example.com/hello 0.177s

这时打开go.mod文件:

module example.com/hello

go 1.14

require rsc.io/quote v1.5.2

可以发现go会自动去找rsc.io/quote这个依赖的最新版本同时加入到go.mod文件中,再次运行单测:

PASS
ok example.com/hello 0.177s

可以发现go第二次已经不需要去找rsc.io/quote。运行go list -m all 返回:

example.com/hello
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c
rsc.io/quote v1.5.2
rsc.io/sampler v1.3.0

可以看到引入外部依赖rsc.io/quote,也会带来它的间接依赖

除了go.mod文件,目录中也会增加一个go.sum文件内容如下:

golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c h1:qgOY6WgZOaTkIIMiVjBQcw93ERBE4m30iBm00nkL0i8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
rsc.io/quote v1.5.2 h1:w5fcysjrx7yqtD/aO+QwRjYZOKnaM9Uh2b40tElTs3Y=
rsc.io/quote v1.5.2/go.mod h1:LzX7hefJvL54yjefDEDHNONDjII0t9xZLPXsUe+TKr0=
rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=

后面增加了每个外部依赖内容的hash值,go通过这些hash值去验证你下载依赖的正确性。

升级版本

通过上面的go list -m all可以看到 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c 我们用到的版本是v0.0.0-20170915032832-14c0d48ead0c。我们接下来升级它的版本:

go get golang.org/x/text
go: golang.org/x/text upgrade => v0.3.3
go: downloading golang.org/x/text v0.3.3 go test
PASS
ok example.com/hello 0.199s

此时go.mod文件内容是:

module example.com/hello

go 1.14

require (
golang.org/x/text v0.3.3 // indirect
rsc.io/quote v1.5.2
)

可以看到golang.org/x/text v0.3.3 // indirect这个间接依赖已经被升级到v0.3.3了。

运行go list -m all 返回:

example.com/hello
golang.org/x/text v0.3.3
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e
rsc.io/quote v1.5.2
rsc.io/sampler v1.3.0

移除没有使用的依赖

运行go mod tidy 可以删除没有使用的包

下载依赖到当前目录

go mod vendor 会下载依赖到vendor中,只会下载你代码中的依赖,不会下载所有go.mod中引用的依赖

Go包管理go mod使用的更多相关文章

  1. go modules包管理

    记录一下go工程迁移go modules的过程. go mod golang从1.11版本之后引入了包管理-go mod,并通过环境变量GO111MODULE 设置: 默认GO111MODULE 为a ...

  2. Go 包管理历史以及 Go mod 使用

    之前也写过 Go 管理依赖工具 godep 的使用,当时看 godep 使用起来还是挺方便,其原因主要在于有总比没有强.关于依赖管理工具其实还是想从头聊聊这个需求以及大家做这个功能的各种出发点. GO ...

  3. golang包管理解决之道——go modules初探

    golang的包管理是一直是为人诟病之处,从golang1.5引入的vendor机制,到准官方工具dep,目前为止还没一个简便的解决方案. 不过现在go modules随着golang1.11的发布而 ...

  4. 拜拜了,GOPATH君!新版本Golang的包管理入门教程

    Go 1.11和1.12实现了对包管理的初步支持,Go的新依赖管理系统使依赖版本信息明确且易于管理.Using Go Modules - The Go Blog 新的包管理模式有什么不同? 作为Go语 ...

  5. [系列] 使用 go modules 包管理工具(一)

    目录 概述 初始化 添加依赖包 go mod 命令 小结 源码地址 概述 我想实现一个开箱即用的 API 框架的轮子,这个轮子是基于 Gin 基础上开发的. 为什么是开箱即用,它会集成哪些功能? 以上 ...

  6. golang包管理的古往今来

    https://golang.org/ before GO1.5-GOPATH 在GO1.5之前用GOPATH以及GOROOT这两个环境变量来决定包的位置. GOROOT就是告知当前go的安装位置,编 ...

  7. 使用 go modules 包管理工具(一)

    概述 我想实现一个开箱即用的 API 框架的轮子,这个轮子是基于 Gin 基础上开发的. 为什么是开箱即用,它会集成哪些功能? 以上功能点,都是常用的,后期可能还会增加. 废话不多说,咱们开始吧. 创 ...

  8. go包管理

    摘自: http://blueskykong.com/2019/02/18/go-dep-1/ https://www.cnblogs.com/apocelipes/p/10295096.html#v ...

  9. nexus 3.17.0 做为golang 的包管理工具

    nexus 3.17.0 新版本对于go 包管理的支持是基于go mod 的,同时我们也需要一个athens server 然后在nexus 中配置proxy 类型的repo 参考配置 来自官方的配置 ...

随机推荐

  1. Asp.Net Core入门之自定义中间件

    什么是中间件? 这里引用官方解释: 中间件是用于组成应用程序管道来处理请求和响应的组件.管道内的每一个组件都可以选择是否将请求交给下一个组件.并在管道中调用下一个组件之前和之后执行某些操作.请求委托被 ...

  2. cb46a_c++_STL_算法_逆转和旋转reverse_rotate函数advance

    cb46a_c++_STL_算法_逆转和旋转reverse_rotateSTL算法--变序性算法reverse() 逆转reverse_copy()一边复制一般逆转rotate()旋转,某个位置开始前 ...

  3. Rigidbody(刚体)方法的初步学习(一)

    概要:这次将简单的了解Rigidbody中的各种方法属性,以官方的API为顺序研究. 蛮牛API翻译:Rigidbody组件控制物体的位置—它使物体在重力影响下下落,并可计算物体将怎样响应碰撞.当操作 ...

  4. Flink 集群搭建,Standalone,集群部署,HA高可用部署

    基础环境 准备3台虚拟机 配置无密码登录 配置方法:https://ipooli.com/2020/04/linux_host/ 并且做好主机映射. 下载Flink https://www.apach ...

  5. InnoDB 中 B+ 树索引的分裂

    数据库中B+树索引的分裂并不总是从页的中间记录开始,这样可能会导致空间的浪费,例如下面的记录: 1, 2, 3, 4, 5, 6, 7, 8, 9 插入式根据自增顺序进行的,若这时插入10这条记录后需 ...

  6. skywalking与pinpoint全链路追踪方案对比

    由于公司目前有200多微服务,微服务之间的调用关系错综复杂,调用关系人工维护基本不可能实现,需要调研一套全链路追踪方案,初步调研之后选取了skywalking和pinpoint进行对比; 选取skyw ...

  7. 尚硅谷maven视频教程笔记

    07.尚硅谷_Maven_部署Maven核心程序.avi 第一步先安装jdk 第二步下载maven 特别需要注意的是maven不能存储在有中文和空格的目录下面 3.调试是否安装成功,在cmd中输入 m ...

  8. PHP 多维数组转json对象

    PHP 多维数组转json对象 php 数组转json对象,可能大家都知道要用json_encode,但是转换出来的格式多有不同,此处做个小小的记录! 1. 一维数组转json对象 <?php ...

  9. Spring IoC BeanDefinition 的加载和注册

    前言 本系列全部基于 Spring 5.2.2.BUILD-SNAPSHOT 版本.因为 Spring 整个体系太过于庞大,所以只会进行关键部分的源码解析. 本篇文章主要介绍 Spring IoC 容 ...

  10. 并发02--JAVA内存模型

    在并发编程中,需要解决两个问题:线程间如何通信&线程间如何同步 线程同步:控制不同线程操作顺序的机制 解决这两个问题的方案有两种:共享内存&消息传递 共享内存:通过使用共享内存,隐式通 ...