源码文件通常会被放在某个工作区的 src 子目录下。
那么在安装后如果产生了归档文件,就会放进该工作区的 pkg 子目录;如果产生了可执行文件,就可能会放进该工作区的 bin 子目录。
安装某个代码包而产生的归档文件是与这个代码包同名的,扩展名是 .a。放置它的相对目录就是代码包的导入的父级文件夹的路径。
执行命令:
go install github.com/labstack/echo
生成的归档文件的相对目录就是 github.com/labstack , 文件名为 echo.a。
上面的相对路径是在pkg目录下的,并且中间还有一层目录,目录的名称是操作系统有关的,叫做平台相关目录。目录名称是操作系统、下划线和计算架构的代号组成。比如:linux_amd64、windows_amd64。
因此上面的代码存放的相对路径是:pkg/windows_amd64/github.com/labstack/echo.a
上述内容也可以去Go安装的路径下查看,比如我的Win10系统,把Go安装在了D盘的根目录下。于是在 D:/Go/pkg/windows_amd64 目录下就可以看到所有标准库的归档文件。
构建使用命令go build,安装使用命令go install。构建和安装代码包的时候都会执行编译、打包等操作,并且这些操作生成的任何文件都会先被保存到某个临时的目录中。
源码文件分为三种,它们都有着不同的用途和编写规则:
如果构建的是库源码文件,那么操作的结果文件只会存在于临时目录中。这里的构建的主要意义在于检查和验证。
也就是构建了临时目录,然后就丢弃了。如果有问题就会报出来,如果没问题就相当于一顿操作后什么都没变化,就是上面说的加和验证。
如果构建的是命令源码文件,那么操作的结果文件会被搬运到那个源码文件所在的目录中。
一般构建就是用来做这个事情的。
安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。
如果安装的是库源码文件,那么结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录中。
如果安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的 bin 目录中,或者环境变量GOBIN指向的目录中。
命令源码文件,通过构建或安装都可以完成编译,只是生成的可执行文件的目录不同。一般就用构建了,可以带参数指定位置。
库源码文件,只有通过安装才能在pkg中生成包文件。
一般就是构建源码文件。库文件的话就是进行安装。
在运行go build命令的时候,默认不会编译目标代码包所依赖的那些代码包,如果归档文件已经存在的话。如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译。常用参数说明:
命令go get会自动下载代码包,并把它们安装到环境变量GOPATH包含的第1工作区的相应目录中。如果存在环境变量GOBIN,那么仅包含命令源码文件的代码包会被安装到GOBIN指向的那个目录。常用参数说明:
go get命令中并没有提供依赖管理的功能。目前GitHub上有很多提供这类功能的第三方工具,比如glide、gb以及官方出品的dep、vgo等等,在它们的内部大都是直接使用go get实现的。
如果你想把你编写的(被托管在不同的代码托管网站上的)代码包的远程导入路径统一起来,或者不希望让你的代码包中夹杂某个代码托管网站的域名,那么你可以选择自定义你的代码包远程导入路径。这种自定义的实现手段叫做“导入注释”。
比如代码实际存储的位置是:github.com/golang/sync/
但是安装的时候实际使用的命令是: go get golang.org/x/sync
。这里就隐藏了github.com的域名,以及后面的部分路径golang。
导入注释必须出现在源码文件的代码包声明语句的右边,是一条单行注释。被双引号包裹的是一个符合导入路径语法规则的字符串。下面是 github.com/golang/sync 下 semaphore/semaphore.go 里的导入注释:
package semaphore // import "golang.org/x/sync/semaphore"
这样加入导入注释后,就无法用github的地址来下载这个包了。但是也无法用自定义的路径来下载这个包,应该自定义的路径的网址还不能响应这个请求
编写一个可处理HTTP请求的程序。将对这个url响应的请求头中加入如下的一行内容:
<meta name="go-import" content="golang.org/x/sync git https://github.com/golang/sync">
这行内容会被视为HTML文档的元数据。这个就是go get命令的文档中要求的写法。它的模式是这样的:
<meta name="go-import" content="import-prefix vcs repo-root">
content属性中的import-prefix的位置上填入自定义的远程代码包导入路径的前缀。而vsc代表与版本控制系统有关的标识,比如git。至于repo-root,它应该是与该处理程序关联的路径对应的Github网站的URL,即实际网址。
这么做的好处是,可以强化你的品牌,而不是某个代码托管网站的。顺便还可以隐藏掉用户ID,也就是域名后的部分路径。
最主要的是,使你的代码包导入路径整齐划一,如果代码包分散在不同的远程路径的话。