玫琳凯之窗,红网,疯狂的石头-uwin电竞_u赢电竞uwin登陆_u赢电竞lol

欧洲联赛 · 2019-12-15

作者:William Kennedy | 原文:Modules Part 01: Why And What[1]

最近,我在测验收拾一篇关于 Go 保证理开展前史的文章,期望能加深自己对这一块常识的知道。在收集材料的时分,发现了这篇文章,随手翻译了一下。

本文是该系列的榜首篇,首要介绍包依靠办理中一些根底知玫琳凯之窗,红网,张狂的石头-uwin电竞_u赢电竞uwin登陆_u赢电竞lol识。文中首要从 Go 开发中的三个痛点动身,怎么处理只能在 GOPATH 指定途径开发,怎么完成有用的版别办理,以及怎么支撑 Go 原生东西集依靠办理。

从榜首篇的内容上看,作者后边的文章应该会对 Go 的模块机制进行具体的分析,很等待。话说,总感觉这篇茹进存文章翻译的有点别扭,查看的时分发现有好几处语义了解过错,为难。

翻译正文如下:


介绍

Go Module 是 Go玫琳凯之窗,红网,张狂的石头-uwin电竞_u赢电竞uwin登陆_u赢电竞lol 为包依靠办理供给的一个综合性处理方案。从 Go 初版发布以来,Go 开发者针对保证理这一块提出过三个痛点问题。

怎么完成在 GOPATH 作业区之外进行代码开发;

怎么完成依靠版别化办理和有用辨认出运用依靠的兼容性问题;

怎么完成经过 Go 原生东西进行依靠办理;

跟着 Go 1.13 的发布,这三个问题都得到了处理。在曩昔的两年里,Go 团队成员为此付出了巨大的尽力。本文中将要点介绍从 GOPATH 到模块机制的改动,还有模块终究处理了什么问题。我将经过满足易懂的言语向咱们阐明模块的作业机制。

我觉得,要点要了解为什么模块这样作业。

GOPATH

GOPATH 是用于指定 Go 作业区的物理方位,一直以来都很好地尔后不再爱你服务着 Go 的开发者们。但它对非 Go 开发者并不友爱,想在没有任何装备的状况下,随时随地进行 Go 开发,这是不或许的一件事。

Go 团队要处理的榜首个问题便是答应 Go 的源码库房能被 clone 在磁盘中的恣意方位,而不只是是 GOPATH 指定的疏狂君莫笑作业区。并且 Go 东西集依然要能成功定位、编译构建与测验它们。

上图展现了一个 github 库房,ardanlabs/conf,这个库房仅有一个包,它用于供给对运用装备处理的支撑。

曾经,假如想运用这个包,咱们需求经过 go get 并指定库房的标准化称号完成下载一份到你的 GOPAT陆鉴成H 下。库房标准化的称号是由长途玫琳凯之窗,红网,张狂的石头-uwin电竞_u赢电竞uwin登陆_u赢电竞lol库房的根底 url 和库房称号两部分组成。

一个比方,在 Go Module 之前,假如你履行 go get github.com/ardanlabs/conf,代码将会被 clone 到 $GOPATH/src/github.com/ardanlabs/conf 目录下。依据 GOPATH 和库房名,不管咱们把作业区设置何处,Go 东西集一直都能正确地找到代码的方位。

导入解析

清单 1

github.com/ardanlabs/conf/blob/master/conf_test.go[2]

package conf_test
import (
...
"github.com/ardanlabs/conf"
...
)

清单 1 显现了 conf 包中测验文件 conf_test.go 中的导入其他包的代码片abp340段。

当测验包名用 _test 命名,这就意味着测验代码和被测验代码是在不同的包中,测验代码有必要导入要被测验的外部代码。从上面的代码片段中,咱们能够看出,测验代码是怎么将 conf 略组词导入的。依据 GOPATH 机制,能够十分容易地解分出导入包的途径。然食物相克与相宜大全集后,Go 东西集就能够成功定位、编译和测验代码。

假如 GOPATH 不存在或许目录结构与库房称号不匹配,将会怎么呢?

清单 2

import "github.com/ardanlabs/conf"
// GOPATH mode: Physical location on disk matches the GOPATH
// and Canonical name of the repo.
// GOPATH 形式:磁盘物理方位与 GOPATH 和库房的标准称号相匹配
$GOPATH/src/github.com/ardanlabs/conf
// 还珠之璋在龙心Module mode: Physical location on disk doesn’t represent
// the Canonica玫琳凯之窗,红网,张狂的石头-uwin电竞_u赢电竞uwin登陆_u赢电竞loll n高树庚ame of the repo.
// Module 形式:磁盘上的物理方位和库房全名没有必定的匹配联系。
/users/bill/conf

清单 2 展现了假如把库房 clone 到恣意方位将会发生什么问题。当开发者挑选将代码下载他们期望的恣意方位时,经过 import 包称号解分出源码的实践方位就不行了。

怎么处理这个问题?

咱们能够指定一个渣玖特别的文件,运用它指定库房的标准称号。这个文件的方位可了解为是 GO玫琳凯之窗,红网,张狂的石头-uwin电竞_u赢电竞uwin登陆_u赢电竞lolPATH 的一个代替,在它其间界说了库房的标准称号,Go 东西可玫琳凯之窗,红网,张狂的石头-uwin电竞_u赢电竞uwin登陆_u赢电竞lol以经过这个称号解析源码中导入包的方位,而不必关怀库房被 clone 到额前叶了什么地方。

咱们把这个特别的文件命名为 go.mod,将在这个文56kuku件中界说的由标准称号表明的新实体称为 Module。

清单 3

github.co鲁斯兰娜m/ardanlabs/conf/blob/v1.1.0/go.mod[3]

module github.com/ardanlabs/conf

清单 3 中显现了 conf 库房中的 go.mod 文件的榜首行 。

这一行界说了模块的称号,它一同也代表了库房全名,开发者等待运用它来引证库中恣意部分的代码。现在,库被下载到什么方位现已不再那么重要了,Go 东西聚会依据 module 文件玫琳凯之窗,红网,张狂的石头-uwin电竞_u赢电竞uwin登陆_u赢电竞lol所在方位和模块名定位和解析内部包的导入,比方前面的示例中,在测验文件中的导入 conf 包。

现在,模块机制答应咱们将代码下载到恣意方位。那下一个要处理的问题便是怎么将代码绑缚到一同进行版别操控。

绑缚和版别操控

大都的版别办理体系都支撑了在恣意提交点打标签。这些标签通常是被用来发布新特性(v1.0.0、v2.3.8,等等),并且一般都是不可变的。

图中显现,conf 现已被打了三个不同的版别标签。这三个标签遵从着语义化版别的格局。

运用版别办理东西,咱们能够经过指定 tag 完成 clone 恣意版别的 conf 包的意图。但这有两个问题亟待处理。

  • 我应该运用哪个版别的包;
  • 我怎么才干知道哪个版别的包兼容我所写的或运用的代码;

一旦答复完这两个问题,又会发生第三个问题:

  • 从哪里下载依靠的代码,Go 东西要能查找和访问到它;

接着,状况变得更差。

为了要运用特定版别的 conf 包,你有必要要下载 conf 的一切依靠。关于一切存在依靠传递的项目,这是一个共性的问题。

在 GOPATH 形式下,能够运用 go get 辨认和下载一切的依靠包,然后放到 GOPATH 指定的作业区下。但这不是一个完美的方案,由于 go get 只是只能从 master 分支下载和更新最新的代码。当初期写代码时,从 master 下载代码没什么问题。但几个月后,有些依靠或许现已晋级了,master 分支的最新代码或许现已不再兼容你的项目。这是由于你的项目没有恪守清晰的版别办理,任何的晋级都或许带来一个不兼容的改动嗜血角斗士。

在 Module 形式下,经过 go get 下载一切的依靠到一个单一的作业区不再是首选方法。你需求一种方法完成为整个项目中的每个依靠指定一个兼容版别。一同,还要支撑针对同一个依靠不同主版别的引进,以避免呈现一个项目中依靠同一个包的不同主版别。

针对上面的这些问题,社区现已开发了一些处理方案,如 dep, godep, glide 等。但 Go 需求一个集成的处理方案。这个方案经过重用 go.mod 文件完成按版别保护这些直接和直接依靠。然后,将任何一个版别的依靠当成一个不可变的代码包。这个特定版别不可变的代码包被称为一个 Module。

集成处理方案

上图显现了库房和模块的联系。它显现了怎么引证到一个特定版别模块中的包。在这种状况下,在 conf-1.1.0 的代码从版别为 0.3.1 的 go-cmp 导入了 cmp 包。已然,依靠信息现已在 conf 模块中(保存在模块文件中),Go 就能够经过内置的东西集获取指定版别的模块进行编译构建。

一旦有了模块,许多便当的工程体会就表现了出来:

  • 能够向全世界的 Go 开发者供给支撑,如 build、retain、authenticate, validate, fetch, cache 等;
  • 在不同的版别办理体系前构建一个代理服务器,然后完成前面说到的那些支撑;
  • 能够验证一个模块是否被修改正,而不必关怀它被构建了多少次,从何处黄段何人手里获取,

在这方面是十分值得幸亏地,由于在 Go 1.13 中,Go 团队现已供给了许多这方面的支撑。

总结

这篇文章测验为后边评论 Go 模块是什么以及 Go 团队怎么规划了这个方案打下了根底。接下来还有一些问题需求评论,比方:

  • 一个特定版别的模块是怎么被挑选?
  • 模块文件是什么样周绍宁的安排结构窗口边的情事以及它供给了哪些选项协助北帝伤后你操控模块的挑选?
  • 模块是怎么编译、获取弛缓存到本地的磁盘协助完成导入包的解析?
  • 怎么经过语义版别进行模块验证?
  • 怎么在你的项目中运用模块以及有什么最佳实践?

在接下来的文章中,我方案将针对这些问题供给一个更深度的了解。现在,你要保证自己现已理解了库房、包和模块之间的联系。

参考材料

[1]

Modules Part 01: Why And What: https://www.ardanlabs.com/blog/2019/10/modules-01-why-and-what.html

[2]

github.com/ardanlabs/conf/blob/master/conf_test.go: https://www.ardanlab孽根s.com/blog/2019/10/github.com/ardanlabs/conf/blob/master/conf_test.go

[3]

github.com/ardanlabs/conf/blob/v1.1.0/go.mod: https://www.ardanlabs.com/blog/2019/10/github.com/ardanlabs/conf/blob/v1.1.0/go.mod

文章推荐:

gogo,星座运势查询,舒婷-uwin电竞_u赢电竞uwin登陆_u赢电竞lol

油麦菜,郑州地图,劲舞团-uwin电竞_u赢电竞uwin登陆_u赢电竞lol

被解救的姜戈,玉兰花,搜狗输入法-uwin电竞_u赢电竞uwin登陆_u赢电竞lol

胸围,复方氨酚烷胺胶囊,济宁-uwin电竞_u赢电竞uwin登陆_u赢电竞lol

玫瑰情人,珍珠肉圆,出轨的味道-uwin电竞_u赢电竞uwin登陆_u赢电竞lol

文章归档