美文网首页Golang程序员
Debian下编译安装Golang

Debian下编译安装Golang

作者: 匿蟒 | 来源:发表于2016-11-07 23:26 被阅读2543次

    我的Debian是用来工作的,因此用的是稳定源。稳定源的优点是,软件经过充分的测试,处于稳定版本。这种状态对于绝大多数软件,都是最合适的。

    但是,对于一些需要最新版本的软件来说,稳定源太过于滞后。

    官网不仅连接不稳定,二进制发布包也不够全。

    目前(2016),Debian的稳定源只能安装go1.3版本。如果需要最新的版本,只能自行从源码编译安装。

    卸载旧版本

    sudo apt-get remove golang
    sudo apt-get autoremove
    

    源码下载

    git clone https://github.com/golang/go.git
    

    如果没有Git,必须自行解决;如果没有gcc,也需要自行安装。

    此外,golang/go这个库实在太大,近200MB。完整从GitHub上拉下来,非常耗时;在GitHub连接不稳定时,也可能会失败。这属于网络问题,读者也需自行解决。

    按时间顺序,这里记录了一些相关的坑。如果想直接按照正确的步骤完成编译,可以跳到环境配置小节。

    首次编译错误

    Go不支持在根目录下编译,必须到src目录去。

    $ cd src
    $ ./all.bash
    ##### Building Go bootstrap tool.
    cmd/dist
    ERROR: Cannot find ~/go1.4/bin/go.
    Set $GOROOT_BOOTSTRAP to a working Go tree >= Go 1.4.
    

    我本来就是因为只有Go1.3,才要从源码安装新版本的。现在找我要Go1.4,这可如何是好?

    自举

    Go从1.5版本开始实现“自举”(Bootstrap),也就是用Go来实现Go、用Go来编译Go。之前都是用C来实现,编译Go项目就是编译C语言。

    因此,只要把源码checkout到1.4版本,就可以不需要依赖于Go自身,解决自我依赖悖论。

    git checkout go1.4
    ./all.bash
    

    二次编译错误:import cycle not allowed

    import cycle not allowed
    package ./cmd/dist
        imports bytes
        imports errors
        imports runtime
        imports runtime/internal/atomic
        imports runtime
    

    Go不支持循环导入,不知算进步还是退步。

    不过,这里倒是体现了价值,提前报错。这个错误的主要原因,是编译时把GOROOT下的源码与GOROOT_BOOTSTRAP下的搞混了。如果Go与Java一样支持循环导入,那么这里就会进行一次错误的编译。

    这个问题大致是路径配置错误导致的。未免误导,这里就不详述复现步骤了。

    总之,先配置好GO的环境路径,能解决大多数错误。

    环境配置

    为了避免go1.4这个目录混杂在我本就已经混乱不堪的$HOME目录,我新建一个隐藏目录.golang,作为Go的相关环境配置的位置。

    把以下配置加入shell的配置文件,bash是~/bashrc

    export GOROOT=$HOME/.golang/go
    export GOPATH=$HOME/.golang/path
    export GOROOT_BOOTSTRAP=$HOME/.golang/go1.4
    export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
    
    • GOROOT是源码与可执行文件的位置。
    • GOPATH是放置Go的第三方安装包的位置。(编译过程中并未使用。)
    • GOROOT_BOOTSTRAP是用来自举的Go目录,是1.4版本。
    • export PATH=*是添加编译好的Go、以及以后通过go get安装的第三方库,进入可执行环境。这句,老鸟应该都很熟。
      由于GOROOT目录下,只有gogofmt两个可执行文件,所以也可以用软链接来配置。

    注意:这里出现了gogo1.4两个目录,它们本质上是相同的。为避免clone两遍,可以直接本地复制。

    cp -r go go1.4
    

    正确的编译步骤

    • 先进入GOROOT_BOOTSTRAP/src,执行git checkout go1.4.3,切换到1.4.3版本。
    • 执行./make.bash
      一般教程(比如本文前面首次编译错误小节)是用./all.bash,其实没必要。./all.bash是编译并测试,而./make.bash只是编译。前者大约5分钟,后者大约2分钟。对我们这种Go语言的使用者而非开发者来说,显然后者就够了。
    • 进入GOROOT目录,执行./make.bash

    结束后,可以检查版本。

    $ go version
    go version devel +f8187ce Mon Nov 7 02:55:52 2016 +0000 linux/amd64
    

    咦?怎么版本怪怪的!

    这是因为master的HEAD,通常是一个开发中的提交,是最新不稳定版本。

    如果想要稳定版怎么办?

    和编译1.4.3版本类似,checkout过去再编译。比如,我现在是1.7.3版本。

    $ git checkout go1.7.3
    ...
    $ ./make.bash
    ...
    $ go version
    go version go1.7.3 linux/amd64
    

    感觉好多了。

    相关文章

      网友评论

        本文标题:Debian下编译安装Golang

        本文链接:https://www.haomeiwen.com/subject/ehtouttx.html