Go36-1-命令行工具-创新互联

源码安装工具 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响应的请求头中加入如下的一行内容:

这行内容会被视为HTML文档的元数据。这个就是go get命令的文档中要求的写法。它的模式是这样的:

content属性中的import-prefix的位置上填入自定义的远程代码包导入路径的前缀。而vsc代表与版本控制系统有关的标识,比如git。至于repo-root,它应该是与该处理程序关联的路径对应的Github网站的URL,即实际网址。

这么做的好处是,可以强化你的品牌,而不是某个代码托管网站的。顺便还可以隐藏掉用户ID,也就是域名后的部分路径。
最主要的是,使你的代码包导入路径整齐划一,如果代码包分散在不同的远程路径的话。

创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。


网站栏目:Go36-1-命令行工具-创新互联
URL链接:http://scyanting.com/article/ggcdi.html