阅读 Docker 源代码的神兵利器
October 17, 2015
Table of Contents
Golang开发环境的安装
阅读Go源码之前,安装Go语言的开发环境是必不可少的。下面我们介绍下载和安装的步骤。
1. 下载官方的Go语言安装包
请根据操作系统的版本(FreeBSD、Linux、Mac OS X或者Windows)以及处理器的架构(386、amd64或者arm)进行选择。下载地址为:https://golang.org/dl/ ,是Google提供的服务,可能需要使用VPN才能访问。
2. 安装Go语言安装包
选择合适的版本下载完成后,就可以开始进行Go语言安装包的安装了,过程如下。
FreeBSD、Linux以及Mac OS X之tar安装
对于FreeBSD、Linux以及Mac OS X用户来说,下载好的tar压缩文件需要再执行以下步骤才算是安装完成。
把压缩包解压至/usr/local目录下,命令如下:
tar -C /usr/local -xzf go$VERSION.$OS-$ARCH.tar.gz
选择适合的压缩包进行安装,例如,如果在64位Linux系统上安装Go 1.2.1版本,那么对应的压缩包就是go1.2.1.linux-amd64.tar.gz。
把/usr/local/go/bin添加到系统的环境变量中,可以通过把下面这行命令加入到/etc/profile(系统所有用户都受影响)或者$HOME/.profile(当前用户受影响)文件中来完成。
export PATH=$PATH:/usr/local/go/bin
提示:Go的安装环境默认安装在/usr/local(Windows系统是C:\)路径下。如果指定某个本地目录为安装路径,就必须设置$GOROOT环境变量。如果要把安装包解压至$HOME目录下,就需要把下面两行代码加入到$HOME/.profile文件中。
export GOROOT=$HOME/go export PATH=$PATH:$GOROOT/bin
Mac OS X之pkg快速安装
下载后缀为.pkg的相关安装包,打开后按照图形界面的指引操作即可顺利安装。使用这种方法时,安装包默认会安装到/usr/local目录下,/usr/local/go/bin也会被加入到环境变量。安装完成后,在终端使用时需要重新开启一个会话,以便生效。
Windows安装
除了源码安装以外,Go官方给用户提供了两种安装开发环境的方法:一种是手动解压缩Zip包安装,这需要设置环境变量;另一种是全自动安装。
MSI安装: 打开MSI文件,按照指引界面一步步操作即可,默认安装在C:\Go路径下。安装器会自动把C:\Go\bin目录加入到环境变量中。同样,需要重启命令行使之生效。
Zip安装: 把Zip文件下载并解压缩到自己选择的目录,推荐C:\Go。如果放到C:\Go以外的目录,需要设置GOROOT变量。然后把解压缩后Go目录下的bin目录(如C:\Go\bin)加入到PATH环境变量中。
Windows下设置环境变量: 在Windows系统下,可以通过“计算机”→“系统属性”→“高级”→“PATH”来设置环境变量。
3. 测试Go语言环境
完成以上步骤后,Go语言环境便安装完成了,最后我们来测试一下。
首先,创建一个hellow.go的空白文件,输入以下代码:
package main import "fmt" func main() { fmt.Printf("hello, world\n") }
然后通过Go语言工具编译运行,示例如下:
$ go run hello.go hello, world
如果看到了hello world,那么一切便大功告成了。
工具的配置与技巧
遗憾的是,Google官方并没有开发出一款专门为Golang打造的IDE,但开源社区为此作出了巨大的贡献。本节将介绍几种常见的IDE与编辑器的配置和使用技巧。
1. LiteIDE
LiteIDE是国人开发的一款专门为Go语言量身定做的IDE,它简单实用、开源并且可跨平台。
下载与安装
LiteIDE的安装文件托管在sourceforge平台上,因为项目是开源的,我们也可以在GitHub上下载项目源代码进行安装。下载地址为:http://sourceforge.net/projects/liteide/files。
打开下载目录,如图1所示,会看到各个版本的下载目录,推荐下载最新的版本。有了Go开发环境的安装经验,安装LiteIDE就会简单很多。
图1 LiteIDE下载列表
下载相应版本的LiteIDE后进行解压缩。不同操作系统的用户,LiteIDE对应的安装方法如下:
- Mac OS X:把解压后的LiteIDE.app直接拖动到Application文件夹下,以后即可在Launchpad中方便地找到并打开它。
- Windows: 解压缩后,在liteide/bin目录下,双击liteide.exe即可打开运行。
- Linux: 解压缩后,在liteide/bin/目录下,双击liteide即可打开运行。
- LiteIDE支持Go语言阅读的功能简介
LiteIDE支持以下Go语言阅读功能。
- Go语言包浏览器(Package browser)
- 类视图和大纲(Class view and outline)
- 文档浏览(Document browser)
- Go语言Api函数检索(GOPATH API index)
- 代码跳转(Jump to Declaration)
- 代码表达式信息显示(Find Usages)
LiteIDE使用的图标是太极两仪的样式,有着浓浓的中国风,打开它就会看到介绍。可以使用打开文件夹功能,直接打开Docker源代码文件夹。如图2所示,在左边可以看到文件浏览目录、类试图、文件夹列表、大纲以及包浏览器这几个功能;右边是打开的Docker官方的README.md文件,可以看到LiteIDE支持预览Markdown格式,这样可以在这个IDE上面方便地读文档。
图2 LiteIDE功能界面展示
打开IDE以后,大家可以在设置中查看和修改快捷键设置,如图3所示。
图3 LiteIDE快捷键设置
需要注意的是,LiteIDE的代码跳转依旧不够完善,只有当跳转到的代码所在的文件处于打开(已经浏览过)状态时,才能正确地跳转。
Linux或者Mac OS X用户可以配合grep命令进行查看。如果我们要查找的函数是get_instance,则命令如下:
grep -rl get_instance docker/api grep -rl [grep_pattern] [file_diretory]
Windows用户可以在文件中使用查找功能。
相信现在你已经能使用LiteIDE比较方便地阅读源码了。
2. Sublime Text 2
Sublime Text 2(简称ST2)自2012年发布以来,便以其简洁华丽的外观、多平台的支持、多语言支持以及超强的可扩展性而风靡起来。同样,作为一款文本编辑器,与VIM相比,它自带有目录树等功能,省去了一些配置上的麻烦,易于上手。
下载
打开Sublime Text的官方网站,页面下方映入眼帘的就是一个大大的Download图标,它会根据操作系统的平台自动选择适合的版本,只需直接点击Download即可下载。当然我们也可以打开下载列表页面(http://www.sublimetext.com/2),根据平台选择合适的版本进行下载。
安装
不同系统的用户可以参照不同的方式下载安装Sublime Text 2,方法如下:
- Windows:下载后打开exe文件,按照引导界面进行安装即可。
- Mac OS X:下载后打开dmg文件,按照引导界面进行安装即可。
- Linux: 下载后进行解压缩,解压缩后进入目录点击sublime_text即可使用。但这样不便于使用,可以按照以下步骤进行配置,以便在终端也可方便地使用Sublime(假设已经解压缩到HOME目录)。 {{{mv $HOME/Sublime\ Text\ 2/ /opt/ sudo ln -s /opt/Sublime\ Text\ 2/sublime_text /usr/local/bin/subl}}}
以上配置完成后,我们便可以方便地在终端通过subl命令打开Sublime Text 2了。
插件安装
Package Control
- 点击菜单栏偏好设置(Preferences)->包浏览(Browse Packages)。
- 打开它的上一级目录Sublime-Text-2/,可以看到“Installed Packages”、“Packages”等文件夹。
- 下载Control.sublime-package包,并且复制到Installed Packages/目录中。
- 重启Sublime Text。
GoSublime
- 安装完Package Control后,默认情况下,通过快捷键Ctrl+Shift+P①即可调出命令执行模块, 输入Package Control:Install Package即可激活包安装。
- 在跳出的可用包列表中,键入GoSublime后按回车键,即可下载并自动安装。
- 安装完GoSublime后,即可使用诸如代码补全、格式调整等功能。
CTags
- 与GoSublime相同,通过快捷键Ctrl+Shift+P调出命令执行模块,输入Package Control:Install Package,在跳出的可用包列表中键入CTags,再按回车键即可自动安装。
- 安装完成后,在Docker项目的根目录下点击鼠标右键,执行CTags:Rebuild Tags,对项目进行CTags检索。
- 通过快捷键Ctrl+Shift+ . 即可进行代码跳转(跳转到定义),通过快捷键Ctrl+Shift+,即可跳回。
至此,Sublime的介绍就完成了,熟练运用以上3个插件,不仅便于阅读Docker源码,对于Go语言项目的编写也会有非常大的帮助。
3. Vim
相信习惯使用文本编辑器的读者,一定对开源软件Vim相当熟悉和亲切。Vim被誉为“编辑器之神”,学习曲线极为陡峭,但是,一旦熟练掌握了Vim自成体系的一套快捷键,代码编辑速度将快速提升,你也会从此对Vim爱不释手。本节只作为对Vim老用户的抛砖引玉,不适于Vim的初学者使用。
插件的安装
go-vim是一款让Vim可以高度支持Go语言的Vim插件,所以也是要使用Vim作为Go IDE的必装插件。
如果使用pathogen对插件进行管理,那么只要执行如下步骤即可。
cd ~/.vim/bundle git clone https://github.com/fatih/vim-go.git
对于Vundle用户,需要在.vimrc文件中加入下面这行:
Plugin 'fatih/vim-go'
并且打开Vim,在命令模式下执行:PluginInstall。
安装完插件后,为确保所有依赖的二进制文件(如gocode、godef、 goimports等),可以在命令模式下执行如下命令进行自动安装:
:GoInstallBinaries
除go-vim外,还有如下可选插件。
- 实时代码自动补全插件:YCM 或 neocomplete;
- 侧边栏类试图插件:tagbar;
- 代码段自动生成插件: ultisnips 或 neosnippet;
- 目录浏览器插件:nerdtree。
常用命令
- :GoDef [identifier]:用于代码跳转,默认会跳转的项为鼠标定位的函数或变量,后面可以跟标识符进行跳转。
- :GoDoc:用于打开相关Go文档。
- :GoInfo:用于显示鼠标定位的标识符的变量类型。
- :GoFmt:用于对选中的代码进行Go格式化。
- :GoDeps:用于显示当前包依赖的其他包。
- :GoFiles:用于显示依赖当前包的其他包。
- :GoInstallBinaries:用于安装Go语言的Vim依赖项。
- :GoUpdateBinaries:用于更新Go语言的Vim依赖项。
关于Vim的介绍到此结束,但相信对于Vim老用户来说,探索才刚刚开始。Vim作为一个经久不衰、广受赞誉的好工具,一直都是每一个Geek心中最好的神兵利器!
4. Emacs
Emacs作为与Vim齐名的文本编辑器,号称“神之编辑器”,用来浏览和编写Go代码也是非常方便的。本节也只作为Emacs老用户的抛砖引玉,在此之前,用户需要做好适合自己的配置。下面我们就以Emacs24为例,简单介绍几个实用的插件,用户需要先使用go get命令安装好gofmt、godef、godoc、gocode等工具。
go-mode
go-mode在提供了自动缩进和语法高亮功能的基础上,还整合了Go语言自带的工具,如gofmt、godoc、godef等。在Emacs24以后的版本中,可以使用自带的Package工具进行安装,命令如下:M-x package-install go-mode下面我们主要介绍格式整理以及定义跳转两项功能的配置。
格式整理
格式整理功能直接调用了gofmt工具,该工具能使用户的代码风格与其他开发人员保持一致。在Emacs中,用户可以直接调用gofmt命令,对当前窗口的代码进行格式整理。另一种方式是为before-save-hook添加函数,示例如下:
(add-hook 'before-save-hook 'gofmt-before-save)
这样在用户每次存档时就会自动进行格式整理。
定义跳转
定义跳转使用了godef工具,该工具能分析用户的代码、其他包内的代码以及Go标准库,实现在这三者间的定义跳转。Emacs提供了godef-jump命令实现跳转,默认绑定键为C-c C-j,用户也可以自己定义按键绑定,如绑定到F3键:
(add-hook 'go-mode-hook '(lambda () (local-set-key (kbd "") 'godef-jump)))
为了在跳转之后能跳转回来,用户可以添加如下配置,这样可以使用F2键回到原先的位置。
(add-hook 'go-mode-hook '(lambda () (local-set-key (kbd "") 'pop-tag-mark)))
此外,go-mode还提供了管理imports、使用godoc等工具,这里不再一一赘述。
company-go
company-go调用gocode工具提供自动完成功能,用户可以直接使用Package工具安装company-mode和company-go,并进行如下配置:
(add-hook 'go-mode-hook 'company-mode) (add-hook 'go-mode-hook (lambda () (set (make-local-variable 'company-backends) '(company-go)) (company-mode)))
Emacs还为用户提供了极大的自由度,建议用户使用最新版本的Emacs和插件,善用Package功能和网上贡献的工具,这样能获得最新的功能和更好的体验。本文节选自《Docker——容器与容器云》,作者:张磊、孙健波。
0 Comments