go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装。整个过程就像安装一个 App 一样简单。

这个命令可以动态获取远程代码包,目前支持的有 BitBucket、GitHub、Google Code 和 Launchpad。在使用 go get 命令前,需要安装与远程包匹配的代码管理工具,如 Git、SVN、HG 等,参数中需要提供一个包名。

这个命令在内部实际上分成了两步操作:第一步是下载源码包,第二步是执行 go install。

go get命令——一键获取代码、编译并安装

hc@ubt:~$ go get github.com/hyper-carrot/go_lib/logging
go get
go getgo get github.com/hyper-carrot/go_lib/logging
/home/hc/golang/lib:
    bin/
    pkg/
        linux_386/
            github.com/
                hyper-carrot/
                    go_lib/
                        logging.a  
    src/
        github.com/
            hyper-carrot/
                go_lib/
                    logging/
    ...
go getgo get
git clonego get

远程导入路径分析

go get
go getgo get

该命令所支持的VCS的信息如下表:

go get
名称 主命令 说明
Mercurial hg Mercurial是一种轻量级分布式版本控制系统,采用Python语言实现,易于学习和使用,扩展性强。
Git git Git最开始是Linux Torvalds为了帮助管理 Linux 内核开发而开发的一个开源的分布式版本控制软件。但现在已被广泛使用。它是被用来进行有效、高速的各种规模项目的版本管理。
Subversion svn Subversion是一个版本控制系统,也是第一个将分支概念和功能纳入到版本控制模型的系统。但相对于Git和Mercurial而言,它只算是传统版本控制系统的一员。
Bazaar bzr Bazaar是一个开源的分布式版本控制系统。但相比而言,用它来作为VCS的项目并不多。
go get
go getgo getgo get-u
go getgo get

表0-3 预置的代码托管站点的信息

名称 主域名 支持的VCS 代码包远程导入路径示例
Bitbucket bitbucket.org Git, Mercurial bitbucket.org/user/project
bitbucket.org/user/project/sub/directory
GitHub github.com Git github.com/user/project
github.com/user/project/sub/directory
Google Code Project Hosting code.google.com Git, Mercurial, Subversion code.google.com/p/project
code.google.com/p/project/sub/directory
code.google.com/p/project.subrepository
code.google.com/p/project.subrepository/sub/directory
Launchpad launchpad.net Bazaar launchpad.net/project
launchpad.net/project/series
launchpad.net/project/series/sub/directory
launchpad.net/user/project/branch
launchpad.net/user/project/branch/sub/directory
IBM DevOps Services hub.jazz.net Git hub.jazz.net/git/user/project
hub.jazz.net/git/user/project/sub/directory
go get
go getgo get

自定义代码包远程导入路径

如果你想把你编写的(被托管在不同的代码托管网站上的)代码包的远程导入路径统一起来,或者不希望让你的代码包中夹杂某个代码托管网站的域名,那么你可以选择自定义你的代码包远程导入路径。这种自定义的实现手段叫做“导入注释”。导入注释的写法示例如下:

package analyzer // import "hypermind.cn/talon/analyzer"
analyzeranalyzergo get github.com/hyper-carrot/talon/analyzer
//hypermind.cngithub.com/hyper-carrothypermind.cn
github.com/hyper-carrot/talon/analyzer // 标准的导入路径
hypermind.cn           /talon/analyzer // 导入注释中的导入路径

你想用你自己的域名替换掉标准导入路径中的哪部分由你自己说了算。不过一般情况下,被替换的部分包括代码托管网站的域名以及你在那里的用户ID就可以了。这足以达到我们最开始说的那两个目的。

go get hypermind.cn/talon/analyzerhypermind.cn
<meta name="go-import" content="hypermind.cn/talon git /link/to?link=https://github.com/hyper-carrot/talon">
<meta name="go-import" content="import-prefix vcs repo-root">
contentimport-prefixvcsgitrepo-roothypermind.cn/talon/link/to?link=https://github.com/hyper-carrot/talon
go get hypermind.cn/talon/analyzeranalyzer
hypermind.cn/talon/analyzergithub.com/hyper-carrot/talon/analyzerhypermind.cn/talon/
hc@ubt:~$ go get github.com/hyper-carrot/talon/analyzer
package github.com/hyper-carrot/talon/analyzer: code in directory /home/hc/golang/lib/src/github.com/hyper-carrot/talon/analyzer expects import "hypermind.cn/talon/analyzer"

与自定义的代码包远程导入路径有关的内容我们就介绍到这里。从中我们也可以看出,Go语言为了让使用者的项目与代码托管网站隔离所作出的努力。只要你有自己的网站和一个不错的域名,这就很容易搞定并且非常值得。这会在你的代码包的使用者面前强化你的品牌,而不是某个代码托管网站的。当然,使你的代码包导入路径整齐划一是最直接的好处。

go get

命令特有标记

go getgo buildgo installgo getgo get
go get
-u
-dgo get
hc@ubt:~$ go get -d github.com/hyper-carrot/go_lib/logging

现在,让我们再来看一下Lib工作区的目录结构:

/home/hc/golang/lib:
    bin/
    pkg/
    src/
        github.com/
        hyper-carrot/
        go_lib/
            logging/
    ...
go get-d
-fixfixfixfix
go get-fix
-ugo get-u
hc@ubt:~$ go get -v github.com/hyper-carrot/go_lib/logging
-v-u
hc@ubt:~$ go get -v -u  github.com/hyper-carrot/go_lib/logging
github.com/hyper-carrot/go_lib (download)
-ugo get-x

智能的下载

go getgo get
go get-xgo getgithub.com/hyper-carrot/go_lib
hc@ubt:~$ go get -v -u -x github.com/hyper-carrot/go_lib
github.com/hyper-carrot/go_lib (download)
cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib
git fetch
cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib
git show-refcd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib
git checkout origin/masterWORK=/tmp/go-build034263530
go getgit fetchgit show-refgo getgit checkout origin/mastergo get
hc@ubt:~$ cd ~/golang/lib/src/github.com/hyper-carrot/go_lib
hc@ubt:~/golang/lib/src/github.com/hyper-carrot/go_lib$ git tag go1
hc@ubt:~$ go get -v -u -x github.com/hyper-carrot/go_lib
github.com/hyper-carrot/go_lib (download)
cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib
git fetch
cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib
git show-ref
cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib
git show-ref tags/go1 origin/go1
cd /home/hc/golang/lib/src/github.com/hyper-carrot/go_lib
git checkout tags/go1
WORK=/tmp/go-build636338114
git show-refgit show-ref tags/go1 origin/go1
go getgo get
go getgo get

本文出至:学新通