16. go get

1.go get	
	用于从远程代码残酷上下载并安装软件包
	指定的代码包会被下载到 %GOPATH 中包含的第一个工作区的 src 目录中

	go get -x github.com/go-errors/errors
	-x 查看过程

	命令go get可以根据要求和实际情况从互联网上下载或更新指定的代码包及其依赖包,并对它们进行编译和安装。
	在上面这个示例中,我们从著名的代码托管站点Github上下载了一个项目(或称代码包),并安装到了环境变量GOPATH中包含的第一个工作区中。

	一般情况下,为了分离自己与第三方的代码,我们会设置两个或更多的工作区。我们现在有一个目录路径为/home/hc/golang/lib的工作区,
	并且它是环境变量GOPATH值中的第一个目录路径。注意,环境变量GOPATH中包含的路径不能与环境变量GOROOT的值重复。
	好了,如果我们使用go get命令下载和安装代码包,那么这些代码包都会被安装在上面这个工作区中。
	我们暂且把这个工作区叫做Lib工作区。在我们运行go get github.com/hyper-carrot/go_lib/logging之后,
	这个代码包就应该会被保存在Lib工作的src目录下,并且已经被安装妥当.

	另一方面,如果我们想把一个项目上传到Github网站(或其他代码托管网站)上并被其他人使用的话,
	那么我们就应该把这个项目当做一个代码包来看待。其实我们在之前已经提到过原因,
	go get命令会将项目下的所有子目录和源码文件存放到第一个工作区的src目录下,而src目录下的所有子目录都会是某个代码包导入路径的一部分或者全部。
	也就是说,我们应该直接在项目目录下存放子代码包和源码文件,并且直接存放在项目目录下的源码文件所声明的包名应该与该项目名相同(除非它是命令源码文件)。
	这样做可以让其他人使用go get命令从Github站点上下载你的项目之后直接就能使用它。

	远程导入路径分析:
	实际上,go get命令所做的动作也被叫做代码包远程导入,而传递给该命令的作为代码包导入路径的那个参数又被叫做代码包远程导入路径。
	go get命令不仅可以从像Github这样著名的代码托管站点上下载代码包,还可以从任何命令支持的代码版本控制系统
	(英文为Version Control System,简称为VCS)检出代码包。任何代码托管站点都是通过某个或某些代码版本控制系统来提供代码上传下载服务的。
	所以,更严格地讲,go get命令所做的是从代码版本控制系统的远程仓库中检出/更新代码包并对其进行编译和安装。

	go get命令在检出代码包之前必须要知道代码包远程导入路径所对应的版本控制系统和远程仓库的URL。

	如果该代码包在本地工作区中已经存在,则会直接通过分析其路径来确定这几项信息。go get命令支持的几个版本控制系统都有一个共同点,
	那就是会在检出的项目目录中存放一个元数据目录,名称为“.”前缀加其主命令名。例如,Git会在检出的项目目录中加入一个名为“.git”的子目录。
	所以,这样就很容易判定代码包所用的版本控制系统。另外,又由于代码包已经存在,我们只需通过代码版本控制系统的更新命令来更新代码包
	,因此也就不需要知道其远程仓库的URL了。对于已存在于本地工作区的代码包,除非要求强行更新代码包,否则go get命令不会进行重复下载。
	如果想要强行更新代码包,可以在执行go get命令时加入-u标记。这一标记会稍后介绍。

	如果本地工作区中不存在该代码包,那么就只能通过对代码包远程导入路径进行分析来获取相关信息了。
	首先,go get命令会对代码包远程导入路径进行静态分析。为了使分析过程更加方便快捷,go get命令程序中已经预置了几个著名代码托管网站的信息。

	一般情况下,代码包远程导入路径中的第一个元素就是代码托管网站的主域名。在静态分析的时候,
	go get命令会将代码包远程导入路径与预置的代码托管站点的主域名进行匹配。如果匹配成功,则在对代码包远程导入路径的初步检查后返回正常的返回值或错误信息。
	如果匹配不成功,则会再对代码包远程导入路径进行动态分析。至于动态分析的过程,我就不在这里详细展开了。

	如果对代码包远程导入路径的静态分析或/和动态分析成功并获取到对应的版本控制系统和远程仓库URL,
	那么go get命令就会进行代码包检出或更新的操作。随后,go get命令会在必要时以同样的方式检出或更新这个代码包的所有依赖包。

	自定义代码包远程导入路径:
	如果你想把你编写的(被托管在不同的代码托管网站上的)代码包的远程导入路径统一起来,或者不希望让你的代码包中夹杂某个代码托管网站的域名,
	那么你可以选择自定义你的代码包远程导入路径。这种自定义的实现手段叫做“导入注释”。导入注释的写法示例如下:
		package analyzer // import "hypermind.cn/talon/analyzer"
	代码包analyzer实际上属于我的一个网络爬虫项目。这个项目的代码被托管在了Github网站上。
	它的网址是:https://github.com/hyper-carrot/talon。如果用标准的导入路径来下载analyzer代码包的话,
	命令应该这样写go get github.com/hyper-carrot/talon/analyzer。不过,如果我们像上面的示例那样在该代码包中的一个源码文件中加入导入注释的话,
	这样下载它就行不通了。我们来看一看这个导入注释。

	导入注释的写法如同一条代码包导入语句。不同的是,它出现在了单行注释符//的右边,因此Go语言编译器会忽略掉它。
	另外,它必须出现在源码文件的第一行语句(也就是代码包声明语句)的右边。只有符合上述这两个位置条件的导入注释才是有效的。
	再来看其中的引号部分。被双引号包裹的应该是一个符合导入路径语法规则的字符串。其中,hypermind.cn是我自己的一个域名。
	实际上,这也是用来替换掉我想隐去的代码托管网站域名及部分路径(这里是github.com/hyper-carrot)的那部分。在hypermind.cn右边的依次是我的项目的名称以及要下载的那个代码包的相对路径。
	这些与其标准导入路径中的内容都是一致的。为了清晰起见,我们再来做下对比。

	github.com/hyper-carrot/talon/analyzer // 标准的导入路径
	hypermind.cn           /talon/analyzer // 导入注释中的导入路径  


	https://github.com/hyper0x/go_command_tutorial/blob/71833ffcab991a2931d3106490d96008f45c3177/0.3.md

猜你喜欢

转载自blog.csdn.net/enlyhua/article/details/82669144