标签 Git 下的文章

也谈Go语言代码包分发

Go语言目前(截至1.0.2版本)尚不支持直接链接.a文件(这里的.a文件指的不是传统静态共享库,而是对golang的非main包build后的产物)。这样一来Go的第三方库包或组织内部的公共代码库包只能以源码的形式分发了。

Go提供了get命令用于获取他人分发的代码包。我们通过get命令既可以获取一些知名代码托管站点上的代码,也可以获取组织内部版本控制服务器上的公共代码。

Go get支持的托管站点包括github、google code、BitBucket以及Launchpad,针对这类情况,我们可以得到“特殊”语法的照顾:

go get github.com/bmizerany/assert
go get bitbucket.org/bmizerany/assert
go get code.google.com/p/assert
go get launchpad.net/assert

由于Go已经“内置”了github、google code等的版本控制工具类型,因此我们无需再做任何额外指定,只需用代码的url(去掉http://)即可。

执行get后,代码会被下载到GOPATH环境变量配置中的第一个路径下的src目录下面。例如:我们的GOPATH=/home/tonybai /goworkspace1:/home/tonybai/goworkspace2,执行go get github.com/bmizerany/assert后,我们将在/home/tonybai/goworkspace1下看到github.com 目录,而assert包在本地的完整路径就是/home/tonybai/goworkspace1/github.com/bmizerany /assert。这样我们在代码中直接import "github.com/bmizerany/assert"即可使用assert这个第三方包了。

在组织内部我们也会有自己的私有公共代码库,一份代码库可能被多个项目所使用。在每个项目中都保存一份公共库代码显然是不利于后续版本升级维护的,这样就需要各个项目统一从同一个地方获取或更新公共库代码。这种情况我们同样可以用go get命令来做。

假设内部使用subversion作为版本控制工具,公共库架设在10.10.12.13/svn0/share/golib。这时我们不能简单地的通 过"go get 10.10.12.13/svn0/share/golib"来获取到代码,我们需要告诉get我们采用哪种版本控制工具,而这种信息的传递是通过在库名称后面加上后缀的方式进行的。比如:

go get "10.10.12.13/svn0/share/golib.svn"

这样在/home/tonybai/goworkspace1下就会出现10.10.12.13/svn0/share/golib.svn目录结构。我 们在代码中可以直接import对应的包,比如import "10.10.12.13/svn0/share/golib.svn/assert"。

通过对get命令特性的了解,我们也可以确定分发的代码包到底应该如何组织。从上面的例子我们可以看出我们分发的代码包结构不需很复杂,直接在库的 repository下建立包目录即可,比如上面例子中库repository为golib,assert就是直接建立在下面的目录,同时也是包名。

go get可自动识别http_proxy环境变量,这样Go也可以通过代理获取外部代码包。

使用外部代码包的项目可以通过go get -u url来更新代码包版本为最新版本。

使用ssh通过http代理访问bitbucket

在很多公司内部,要想访问外部互联网都需要设置代理,我所在公司也是这样,有些时候这种限制真的可以让人骂娘。不过经过几年与代理的"斗争"后,大部分需 要访问外部网络的软件(比如subversion、apt-get、git、wgetc、filezilla等)经过设置后还都可以正常工作。不过前些日 子在折腾bitbucket上的源码库时又遇到了代理问题:无论通过https方式还是ssh方式都无法clone bitbucket上的git库。

之所以用bitbucket而不是github是因为前者提供免费的private repository,而后者则是收费的。今天又亟需访问bitbucket上的库,于是再次尝试突破代理的限制。

这次想到一个思路:ssh是否可以通过http代理出去呢?Google的结果告诉我:可以!于是眼前一亮,开始折腾。

首先要安装一个名为connect-proxy的链接代理软件:sudo apt-get install connect-proxy,软件不大,瞬间就安装完比。

然后创建~/.ssh/config配置文件(如果之前已经存在该文件,就打开该文件),将如下配置写入该配置文件:

## ssh access bitbucket.or via HTTP proxy
Host bitbucket.org
ProxyCommand connect -H user@proxy_server:port %h %p

## other sites, do NOT use proxy
Host *
ProxyCommand connect %h %p

这里的配置很清晰,当匹配到bitbucket.org这个host时,ssh经由http proxy访问相应的主机;其他主机,则直接访问。注意connect命令其实就是connect-proxy,通过ls -l命令可以看到/usr/bin/connect -> connect-proxy。保存该配置文件后,尝试clone一个bitbucket上的repository,例如:

$> git clone git@bitbucket.org:lindekleiv/jquery-ui-colorpicker.git

$> ~/proj/opensource$ git clone git@bitbucket.org:lindekleiv/jquery-ui-colorpicker.git
Initialized empty Git repository in /home/tonybai/proj/opensource/jquery-ui-colorpicker/.git/
Enter proxy authentication password for user@proxy_server:
remote: Counting objects: 33, done.
remote: Compressing objects: 100% (32/32), done.
remote: Total 33 (delta 18), reused 0 (delta 0)
Receiving objects: 100% (33/33), 16.04 KiB, done.
Resolving deltas: 100% (18/18), done.

可以看到命令执行后,会提示你输入访问代理的密码。输入正确的密码后,我们可以看到git可以顺利访问到bitbucket上的jquery-ui-colorpicker这个库了。

这里有一点挺让人糟心,那就是每次都得输入访问proxy server的密码,man connect-proxy也没有发现放置http_proxy代理密码的地方,用-h选项也不行。

注意这种用ssh访问的前提是将本地生成的公钥放置在你的bitbucket账户的"SSH keys"中了。

BTW,理论上这种ssh通过http代理的方式对github也同样适用。

如发现本站页面被黑,比如:挂载广告、挖矿等恶意代码,请朋友们及时联系我。十分感谢! Go语言第一课 Go语言精进之路1 Go语言精进之路2 Go语言编程指南
商务合作请联系bigwhite.cn AT aliyun.com

欢迎使用邮件订阅我的博客

输入邮箱订阅本站,只要有新文章发布,就会第一时间发送邮件通知你哦!

这里是 Tony Bai的个人Blog,欢迎访问、订阅和留言! 订阅Feed请点击上面图片

如果您觉得这里的文章对您有帮助,请扫描上方二维码进行捐赠 ,加油后的Tony Bai将会为您呈现更多精彩的文章,谢谢!

如果您希望通过微信捐赠,请用微信客户端扫描下方赞赏码:

如果您希望通过比特币或以太币捐赠,可以扫描下方二维码:

比特币:

以太币:

如果您喜欢通过微信浏览本站内容,可以扫描下方二维码,订阅本站官方微信订阅号“iamtonybai”;点击二维码,可直达本人官方微博主页^_^:
本站Powered by Digital Ocean VPS。
选择Digital Ocean VPS主机,即可获得10美元现金充值,可 免费使用两个月哟! 著名主机提供商Linode 10$优惠码:linode10,在 这里注册即可免费获 得。阿里云推荐码: 1WFZ0V立享9折!


View Tony Bai's profile on LinkedIn
DigitalOcean Referral Badge

文章

评论

  • 正在加载...

分类

标签

归档



View My Stats