門外漢的 Go 輕量開發環境


最近想來玩玩 Go,想說就在 Raspberry Pi 中用 Docker 裝個環境,不過 Go 官方並沒有提供 ARMv7 的下載版本,怎麼辦呢?

由於我打算用 armv7/armhf-ubuntu:14.04 映像檔來建,如果在當中使用 apt-get install golang 的話,是會安裝 Go,不過是 1.2.1 的版本。

如果自己想編譯 Go 1.5 的話,由於 1.5 之後的版本 No more C 了,可以直接用 Go 來編譯 Go 1.5,也就是說,我得先有個 Go 1.4,才能編譯 Go 1.5,在 GoArm 中,有篇 Building Go 1.5 on the Raspberry Pi - Dave Cheney,就是先下載 Go 1.4 編譯器,再用它來編譯 Go 1.5。

Unofficial ARM tarballs for Go 中,也有列出一些 ARM 上可用的 go1.4.2 等非官方版本可下載。如果要更省事的話,在 Go version 1.5 on the Raspberry Pi 中,也有 Raspberry Pi 上可運行的 Go 1.5 非官方版本可下載。

不過,如果用非官方版本不是很信任的話,那麼就像我一樣,自行從 Go 1.4 開始編譯,然後再用它來編譯 Go 1.5 吧!

編譯 Go 1.4

如果從 armv7/armhf-ubuntu:14.04 映像檔開始,首先必須先安裝一些基本工具,包括 wget,以及 gccmake 等:

$ apt-get update
$ apt-get install bison ed gawk gcc libc6-dev make wget

接著取得 Go 1.4 的原始碼壓縮檔,解開並移至想要安裝的目錄之中:

$ wget https://storage.googleapis.com/golang/go1.4.3.src.tar.gz
$ tar zxvf go1.4.3.src.tar.gz
$ rm go1.4.3.src.tar.gz
$ mv go opt/go1.4.3

然後,進入 Go 1.4 的 src 目錄之中,執行 make.bash

$ cd /opt/go1.4.3/src
$ ./make.bash

你也可以執行 all.bash,這會在編譯完成之後進行測試,這樣從編譯到完成測試,在 Raspberry Pi 2 上,差不多要花近一個小時,若不想花這麼久的時間,那麼執行 make.bash 可以可以略過測試。

編譯 Go 1.5

完成 Go 1.4 的編譯之後,接著可以開始進行 Go 1.5 的編譯,首先取得 Go 1.5 的原始碼壓縮檔,解開並移至想要安裝的目錄之中:

$ cd /opt
$ wget https://storage.googleapis.com/golang/go1.5.1.src.tar.gz
$ tar zxvf go1.5.1.src.tar.gz && \
$ rm go1.5.1.src.tar.gz

然後,進入 Go 1.5 的 src 目錄之中,執行 make.bash

$ cd /opt/go/src
$ GOROOT_BOOTSTRAP=/opt/go1.4.3 GOOS=linux GOARCH=arm GOARM=7 ./make.bash

注意,GOROOT_BOOTSTRAP 必須設定為方才編譯完成的 Go 1.4 目錄。如果你要在編譯完成之後,進行完整的測試,可以改執行 all.bash。完成編譯之後,Go 1.4 就看你要不要留著了,不想的話直接刪掉它的目錄就可以了。

如果你懶得自己編譯的話,可以直接 pull 我的 caterpillar/rpi-golang 映像檔,該映像檔所使用的 Dockerfile 如下:

FROM armv7/armhf-ubuntu:14.04
MAINTAINER Justin Lin <caterpillar@openhome.cc>

ENV TERM linux

# update and wget
RUN apt-get -qq update && \
    apt-get -qqy install wget

# C tools
RUN apt-get -qqy install bison ed gawk gcc libc6-dev make

# go 1.4.3

RUN wget https://storage.googleapis.com/golang/go1.4.3.src.tar.gz && \
    tar zxvf go1.4.3.src.tar.gz && \
    rm go1.4.3.src.tar.gz && \
    mv go opt/go1.4.3

WORKDIR /opt/go1.4.3/src

RUN ./make.bash

# go 1.5.1

WORKDIR /opt

RUN wget https://storage.googleapis.com/golang/go1.5.1.src.tar.gz && \
    tar zxvf go1.5.1.src.tar.gz && \
    rm go1.5.1.src.tar.gz

WORKDIR /opt/go/src

RUN GOROOT_BOOTSTRAP=/opt/go1.4.3 GOOS=linux GOARCH=arm GOARM=7 ./make.bash

WORKDIR /opt

RUN rm -rf go1.4.3

# env variables

ENV GOROOT /opt/go
ENV PATH $PATH:$GOROOT/bin

WORKDIR /

安裝 vim 與相關 plugin

基本上,有了 Go 1.5 就可以開始來玩玩 Go,由於之前為了〈門外漢的 Java 輕量開發環境〉,玩了一下 vim 的幾個 plugin,感覺還不錯,那麼就也為 Go 裝些 vim 的 plugin 吧!

不過,之前在裝 vim 的 plugin 時,總覺得很麻煩,想說有沒有 vim 的 plugin 管理程式之類的,後來搜尋了一下,我選擇使用 Vundle.vim,當然,為了安裝 Vundle.vim,必須先安裝 vim 與 git:

$ apt-get -qqy install vim git

接著以 git clone 下載 Vundle.vim 至 ~/.vim/bundle:

$ git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

然後編輯 .vimrc,加入以下內容:

filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'

Plugin 'fatih/vim-go'
Plugin 'kien/ctrlp.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'Townk/vim-autoclose'

call vundle#end()
filetype plugin indent on

let g:NERDTreeDirArrows=0

其中除了 Plugin 'VundleVim/Vundle.vim' 是必要的 plugin之外,其餘都是視需要而加入,最後一行是指定 nerdtree 中的箭頭符號,沒有設置的話,nerdtree 中的樹狀目錄會出現亂碼。

vim-go 是針對 Go 的 plugin,ctrlp.vim 是可以進行檔案模糊搜尋的 plugin(用過 SublimeText 的應該知道這是什麼東西),nerdtree 是類似檔案總管的樹狀目錄 plugin,而 vim-autoclose 是可以自動完成括號、引號配對的 plugin。

每次想要加入新的 plugin,只要在 .vimrc 增加 Plugin 設定之後,開啟一個 vim,然後執行 :PluginInstall,就會自動下載 plugin 完成設置,或者也可以直接在終端機下執行:

$ vim +PluginInstall +qall

接著,設置 GOPATH 環境變數至你想要的 Go 工作目錄,我是設置為 /root/workspace/go,然後開啟一個 vim,執行 :GoInstallBinaries,這會下載其他 vim-go 本身會用到的 plugin,或者也可以直接在終端機下執行:

$ export GOPATH=~/workspace/go
$ vim +GoInstallBinaries +qall

vim-go 本身會安裝的 plugin,可以在 ~/.vim/bundle/vim-go/plugin/go.vim 中查看:

let s:packages = [
            \ "github.com/nsf/gocode",
            \ "golang.org/x/tools/cmd/goimports",
            \ "github.com/rogpeppe/godef",
            \ "golang.org/x/tools/cmd/oracle",
            \ "golang.org/x/tools/cmd/gorename",
            \ "github.com/golang/lint/golint",
            \ "github.com/kisielk/errcheck",
            \ "github.com/jstemmer/gotags",
            \ ]

至於這些 plugin 各自怎麼使用,可以查看它們的網站上各自的說明囉(其實是我也還在一個一個瞭解中…XD)!

我完成的 Docker 映像檔是 caterpillar/rpi-golang-dev,完整的 Dockerfile 是:

FROM caterpillar/rpi-golang
MAINTAINER Justin Lin <caterpillar@openhome.cc>

ENV TERM linux

# update, vim and git
RUN apt-get -qq update && \
    apt-get -qqy install vim git

# Vundle plugins
WORKDIR /root

RUN mkdir -p /root/.vim/bundle && \
    git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

RUN echo "filetype off" >> .vimrc && \
    echo "set rtp+=~/.vim/bundle/Vundle.vim" >> .vimrc && \
    echo "call vundle#begin()" >> .vimrc && \
    echo "Plugin 'VundleVim/Vundle.vim'" >> .vimrc && \
    echo "Plugin 'fatih/vim-go'" >> .vimrc && \
    echo "Plugin 'kien/ctrlp.vim'" >> .vimrc && \
    echo "Plugin 'scrooloose/nerdtree'" >> .vimrc && \
    echo "Plugin 'Townk/vim-autoclose'" >> .vimrc && \
    echo "call vundle#end()" >> .vimrc && \
    echo "filetype plugin indent on" >> .vimrc && \
    echo "let g:NERDTreeDirArrows=0" >> .vimrc

RUN vim +PluginInstall +qall

# GoInstallBinaries

RUN mkdir -p /root/workspace/go

ENV GOPATH /root/workspace/go

RUN vim +GoInstallBinaries +qall

WORKDIR /root/workspace/go

# Define default command.
CMD ["bash"]
來個簡單的擷圖吧!

門外漢的 Go 輕量開發環境

話說,fatih/vim-go 中的擷圖一整個威啊!再慢慢來試吧!… XD

fatih/vim-go