阅读Docker源代码的神兵利器

jopen 8年前

正所谓“磨刀不误砍柴工”,本文将介绍几个阅读源码所要用到的神兵利器。其中,LiteIDE是国人开发的专为Go语言而生的集成开发环境(IDE),它 可以用以简洁和美观著称的Sublime Text 2编辑器进行源码阅读。当然,作为一代Geek,我们还可以选择使用长盛不衰的Vim和Emacs。相信通过本节的阅读,一定能让读者在阅读源码时更加得 心应手。

Golang开发环境的安装

阅读Go源码之前,安装Go语言的开发环境是必不可少的。下面我们介绍下载和安装的步骤。

1. 下载官方的Go语言安装包

请根据操作系统的版本(FreeBSD、Linux、Mac OS X或者Windows)以及处理器的架构(386、amd64或者arm)进行选择。下载地址为: https://golang.org/dl/ ,是Google提供的服务,可能需要使用V*N才能访问。

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就会简单很多。
阅读Docker源代码的神兵利器

图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上面方便地读文档。
阅读Docker源代码的神兵利器

图2    LiteIDE功能界面展示

打开IDE以后,大家可以在设置中查看和修改快捷键设置,如图3所示。
阅读Docker源代码的神兵利器

图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 "<f3>") 'godef-jump)))

为了在跳转之后能跳转回来,用户可以添加如下配置,这样可以使用F2键回到原先的位置。
(add-hook 'go-mode-hook  '(lambda () (local-set-key (kbd "<f2>") '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——容器与容器云》,作者:张磊、孙健波。

来自:http://dockone.io/article/709