..

使用 go modules功能

使用go modules功能的前提条件,二选一

概念介绍

这本主要讲一个写go modules引入的新概念,你尅话四十分钟了解一下官方文档,或者花40分钟看下这个视频,或者看下更加详细的博客

Modules

Modules是一组功能相关的golang包,他们被统一的版本管理起来。大部分情况下,我们是一个仓库一个版本管理,但是现在我们希望一个仓库能够同时版本管理多个Module。 Modules record precise dependency requirements and create reproducible builds.

Modules 精准的记录了依赖关系,保证了项目可重复编译。Modules同时也是语义化的版本管理,例如:v0.1.0, v1.2.3, or v3.0.1。这个前置 v字符是必须要求有的,如果是使用git来管理版本,那么这应该就是git tag 。

go.mod

Modules使用 go.mod 文件记录了源码的代码结构,并且他不要求你的代码必须在GOPATH中。在 go.mod 中所有的Module都有一个前缀:模块的路径。使用module字段来定义一个新的Module,例如:里面包含两个 package,example.com/my/thing/fooexample.com/my/thing/bar ,那么 go.mod 文件里面第一行因该是 module example.com/my/thing 。 就是golang代码一样,Modules文件里面也可以加入一些注释。下面是一个 go.mod 文件的例子:

module github.com/my/module/v3

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

Module定义文件一共有四个指令: module, require, exclude, replaceexcludereplace一般只用在主Module里面,excludereplace 使用在非主Modules里面的时候会被忽略。在源码中,我们通过完整的路径来导入导入一个 Module,例如:

import "example.com/my/module/v2/pkg/foo

我们从example.com/my/module这个Module中导入foo这个package,并且指定他的版本是v2版本。

版本选择

如果你在你的代码中导入了一个的package,但是这个它还没有被加入到go.mod文件中,那么在当前目录下,任何go命令(go build)都会触发更新go.mod文件,会自动查找合适版本的Modulego.mod文件中,通过require指引来引用这个Module