在开始学习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.yv1.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项目,求星~ 点我即达

文档更新时间: 2020-08-08 22:03   作者:kuteng