源码安装工具 go install
源码文件通常会被放在某个工作区的 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
构建使用命令go build,安装使用命令go install。构建和安装代码包的时候都会执行编译、打包等操作,并且这些操作生成的任何文件都会先被保存到某个临时的目录中。
源码文件分为三种,它们都有着不同的用途和编写规则:
- 命令源码文件,声明属于main包并且包含一个main主函数(应该还是个无参数无返回值的函数),所以可以被直接执行
- 库源码文件,不含主函数的包文件,不能被直接运行,它仅用于存放程序实体。
- 测试源码文件,名称以_test.go结尾的源文件。不是下面要讲的,略过。
构建 go build
如果构建的是库源码文件,那么操作的结果文件只会存在于临时目录中。这里的构建的主要意义在于检查和验证。
也就是构建了临时目录,然后就丢弃了。如果有问题就会报出来,如果没问题就相当于一顿操作后什么都没变化,就是上面说的加和验证。
如果构建的是命令源码文件,那么操作的结果文件会被搬运到那个源码文件所在的目录中。
一般构建就是用来做这个事情的。
安装 go install
安装操作会先执行构建,然后还会进行链接操作,并且把结果文件搬运到指定目录。
如果安装的是库源码文件,那么结果文件会被搬运到它所在工作区的 pkg 目录下的某个子目录中。
如果安装的是命令源码文件,那么结果文件会被搬运到它所在工作区的 bin 目录中,或者环境变量GOBIN指向的目录中。
小结
命令源码文件,通过构建或安装都可以完成编译,只是生成的可执行文件的目录不同。一般就用构建了,可以带参数指定位置。
库源码文件,只有通过安装才能在pkg中生成包文件。
一般就是构建源码文件。库文件的话就是进行安装。
go build 命令
在运行go build命令的时候,默认不会编译目标代码包所依赖的那些代码包,如果归档文件已经存在的话。如果被依赖的代码包的归档文件不存在,或者源码文件有了变化,那它还是会被编译。常用参数说明:
- -a : 可以强制编译依赖的代码包
- -i : 不但要编译依赖的代码包,还要安装它们的归档文件
- -x : 查看go build命令具体执行了哪些操作
- -n : 同上,只查看操作,但是不实际执行
- -v : 可以看到go build命令编译的代码包的名称。搭配-a参数使用时很有用
go get 命令
命令go get会自动下载代码包,并把它们安装到环境变量GOPATH包含的第1工作区的相应目录中。如果存在环境变量GOBIN,那么仅包含命令源码文件的代码包会被安装到GOBIN指向的那个目录。常用参数说明:
- -u : 下载并安装代码包,不论是否已存在
- -d : 只下载代码包,不安装代码包
- -fix : 在下载代码包后先运行一个用于根据当前Go语言版本修正代码的工具,然后再安装代码包
- -t : 同时下载测试所需的代码包
- -insecure : 允许通过非安全的网络协议下载和安装代码包。比如:HTTP。
包的依赖管理
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,也就是域名后的部分路径。
最主要的是,使你的代码包导入路径整齐划一,如果代码包分散在不同的远程路径的话。
有疑问加站长微信联系(非本文作者)
![](https://static.golangjob.cn/static/img/footer.png?imageView2/2/w/280)