Go Mod(二)Go Mod的基本概念

Go Mod 概念声明

Modules

Modules是相关的Go软件包的集合,这些Go软件包一起作为一个单元进行了版本控制。

模块记录了每个依赖需求并创建了可以复用的构建。

通常,版本控制库(如Github、GitLib等)仅包含一个定义在存储库的根目录的一个模块。
(如果一个存储库中包含了多个模块将会导致更多的工作量)

存储库(Repositories)、模块(Modules)、包(Packages)之间的关系如下:

  • 一个存储库包含一个或多个Go模块。
  • 每个模块包含一个或多个Go包。
  • 每个包在一个目录下包含了一个或多Go源文件

模块必须根据Semver规范进行语义版本控制,通常采用v(major).(minor).(patch)的形式。

例如v0.1.0,v1.2.3或v1.5.0-rc.1(必须使用前置符号:v)。

如果使用Git工具,则标记为提交版本。

公共、私有模块存储库和代理都可以使用。

go.mod

模块被声明在Go源码文件树根目录下的go.mod文件中。模块源码可以存在于GOPATH环境变量之外。

四种指令:module require replace exclude

这里根据github.com/my/thing声明了一个示例:

module github.com/my/thing

require (
    github.com/some/dependency v1.2.3
    github.com/another/dependency/v4 v4.0.0
)

模块通过在go.mod中的module指令(通常为第一行)提供的模块路径声明其身份(标识符)。
模块路径作为该模块内所有包的工共前缀。
模块路径和模块内的Package的相对于go.mod文件的路径组合成为了该包的导入路径。

举例说明:

现在你有一个模块路径为github.com/user/mymod的模块仓库。
包含两个包:github.com/user/mymod/foogithub.com/user/mymod/bar
go.mod的第一行将被声明为module github.com/user/mymod,同时在磁盘上可能是如下的存在方式。

mymod
|-- bar
|   `-- bar.go
|-- foo
|   `-- foo.go
`-- go.mod

在Go的源码中,应该使用包含了模块路径的全路径进行引入指定包。
例如在上面的例子中,如果需要引用bar.go这个文件,你应该做如下声明:

import "github.com/user/mymod/bar"

excludereplace指令仅在当前模块上起作用。
在构建过程中,其他模块中的excludereplace指令将会被忽略。
因此,replace和exclude语句允许主模块完全控制其自身的构建,而不受依赖项的完全控制。

版本选择

如果在Go源码中,引入了一个没有在go.mod中声明的模块,在执行go build或者go test的指令时,将会自动寻找目标模块的最高版本,并使用
require指令进行引入。
比如你想引用模块A,而模块A的当前最高版本为v1.2.3,然后在你的模块中,go.mod将会使用require指令引入M v1.2.3。
这代表着,你接受版本>=v1.2.3并且小于v2。(在规范中,v(y)于v(x)不兼容)

最小版本选择算法用于选择构建中使用的所有模块的版本。
对于构建中的每个模块,通过最小版本选择的版本始终是主模块中的require指令或其依赖项之一明确列出的版本的语义上最高的版本。

上述表达很难懂,没关系,看例子

你的模块中依赖了两个模块:A,B, A模块依赖D模块(v1.0.0),B模块依赖D模块(v1.1.1),那么此时最小版本选择算法将会选择Dv1.1.1
即使一段时间后,v1.2.0已经可用,但是最小版本仍会选择v1.1.1。当然你可以利用指令手动升级,升级到最新可用版本,或者直接手动选择版本。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值