在开始学习module机制之前,我们有必要初步了解一下其涉及的基本概念,比如到底什么是module等。
Module的定义
首先,module是个新鲜又熟悉的概念。新鲜是指在以往GOPATH和vendor时代都没有提及,它是个新的词汇。
为什么说熟悉呢?因为它不是新的事物,事实上我们经常接触,这次只是官方给了一个统一的称呼而矣。
拿开源项目https://github.com/blang/semver
举例,这个项目是一个语义化版本处理库,当你的项目需要时可以在你的项目中import,比如:
"github.com/blang/semver"
https://github.com/blang/semver
项目中可以包含一个或多个package,不管有多少package,这些package都随项目一起发布,即当我们说github.com/blang/semver
某个版本时,说的是整个项目,而不是具体的package。此时项目https://github.com/blang/semver
就是一个module。
官方给module的定义是:A module is a collection of related Go packages that are versioned together as a single unit.
,定义非常晰,一组package的集合,一起被标记版本,即是一个module。
通常而言,一个仓库包含一个module(虽然也可以包含多个,但不推荐),所以仓库、module和package的关系如下:
- 一个仓库包含一个或多个Go module;
- 每个Go module包含一个或多个Go package;
- 每个package包含一个或多个Go源文件;
此外,一个module的版本号规则必须遵循语义化规范(https://semver.org/),版本号必须使用格式`v(major).(minor).(patch)`,比如`v0.1.0`、`v1.2.3` 或v1.5.0-rc.1
。
语义化版本规范
语义化版本(Semantic Versioning)已成为事实上的标准,几乎知名的开源项目都遵循该规范,更详细的信息请前往https://semver.org/ 查看,在此只提炼一些要点,以便于后续的阅读。
版本格式v(major).(minor).(patch)
中major指的是大版本,minor指小版本,patch指补丁版本。
- major: 当发生不兼容的改动时才可以增加major版本;比如
v2.x.y
与v1.x.y
是不兼容的; - minor: 当有新增特性时才可以增加该版本,比如
v1.17.0
是在v1.16.0
基础上加了新的特性,同时兼容v1.16.0
; - patch: 当有bug修复时才可以 增加该版本,比如
v1.17.1
修复了v1.17.0
上的bug,没有新特性增加;
语义化版本规范的好处是,用户通过版本号就能了解版本信息。
除了上面介绍的基础概念以外,还有描述依赖的go.mod
和记录module的checksum的go.sum
等内容,
这部分内容比较多且比较复杂,在后面的章节中我们通过实际的例子逐步展开介绍,否则提前暴露过多的细节容易造成困惑而徒生挫败感。
赠人玫瑰手留余香,如果觉得不错请给个赞~
本篇文章已归档到GitHub项目,求星~ 点我即达