如何在Ubuntu16.04上从源代码构建Go

来自菜鸟教程
跳转至:导航、​搜索

介绍

Go 是一种由 Google 开发的现代开源编程语言。 它很简单,并且有一套强大的库和工具,可以轻松构建可靠和高效的应用程序。

如果您想针对最新版本的语言测试您的 Go 应用程序、为 Go 代码库做出贡献或拥有更好的 Go 版本管理,您需要从源代码构建 Go。 本教程将向您展示如何构建 Go,涵盖一些实际考虑因素,并构建一个“Hello, World”测试应用程序。

先决条件

要遵循本教程,您将需要:

第 1 步 — 安装构建依赖项

在开始之前,请确保您的存储库缓存是最新的。

sudo apt-get update

默认情况下,Ubuntu 不附带构建 Go 所需的所有软件包,例如其编译器、库和工具。 通过安装 build-essential 可以轻松安装构建和编译依赖项,该软件包包括用于编译 C 的 gcc、用于编译 C++ 的 g++make,一个构建自动化工具。

sudo apt-get install build-essential

安装完成后,您将拥有从源代码构建 Go 的所有必要工具。 接下来,您将需要 Go 1.4 二进制文件。

第 2 步 — 安装 Go 1.4.3

构建 Go 1.5+ 需要您拥有 Go 1.4。 这是因为 Go 1.5+ 的工具链是用 Go 本身编写的。 您可以使用 Go 1.4 或任何版本(1.4.1、1.4.2 或 1.4.3); 在本教程中,我们将使用 Go 1.4.3。

带有 SHA1 校验和的 Go 二进制文件可以在 Go 的下载页面 上找到。 将名为 go1.4.3.linux-amd64.tar.gz 的文件下载到您的主目录。

cd ~
curl -O https://storage.googleapis.com/golang/go1.4.3.linux-amd64.tar.gz

虽然此文件是从正版来源下载的,但验证所下载内容的完整性仍然是一种很好的安全做法。 这很容易通过比较下载页面上提供的文件哈希和下载文件的哈希来完成。

首先,获取您下载的文件的哈希值。

sha1sum go1.4.3.linux-amd64.tar.gz

将此命令的输出与 Go 下载页面上提供的校验和进行比较。

Output332b64236d30a8805fc8dd8b3a269915b4c507fe  go1.4.3.linux-amd64.tar.gz

如果校验和匹配,您可以解压缩文件。

tar xvf go1.4.3.linux-amd64.tar.gz

x 标志代表 eXtract,v 告诉 tar 使用 Verbose 输出(即 列出正在提取的文件),f 让我们指定 F 文件名。

Go 1.4 现在解压到名为 go 的目录中,但 Go 构建脚本默认在 ~/go1.4 中查找 Go 1.4 二进制文件。 使用 mv 命令重命名目录。

mv go go1.4

现在你有了从源代码构建 Go 所需的依赖项。 如果你想将 Go 1.4 从你的主目录移到另一个位置,你可以按照下一步进行。 如果没有,您可以继续执行第 4 步来克隆 Go 源代码。

第 3 步 — 重新定位 Go 1.4.3(可选)

当 Go 构建脚本运行时,它将根据名为 GOROOT_BOOTSTRAP 的环境变量查找 Go 1.4。 如果该变量未设置(默认情况下),则构建脚本将假定 go1.4 目录位于您的主目录中。 如果要将 Go 1.4 移动到另一个位置,可以使用 GOROOT_BOOTSTRAP 变量。 在这里,我们将其移动到 /usr/local/go1.4

首先,移动目录本身。

sudo mv go1.4 /usr/local

接下来,您需要通过修改 ~/.profile 文件来设置环境中的路径。

sudo nano ~/.profile

在文件末尾,添加以下行:

~/.profile

. . .
export GOROOT_BOOTSTRAP=/usr/local/go1.4

保存文件并退出。 要使此更改生效,请刷新您的个人资料。

source ~/.profile

接下来,您将克隆 Go 源代码。

第四步——获取 Go 源码

存储 Go 二进制文件的推荐位置是 /usr/local,这是我们将在本教程中使用的位置。 但是,您可以将其存储在您喜欢的任何位置。

进入 /usr/local 并使用 Git 克隆存储库。

cd /usr/local
sudo git clone https://go.googlesource.com/go

我们需要以 root 权限执行 git clone,因为 /usr/localroot 拥有。 如果您正在克隆转到您的用户具有写入权限的目录,则可以在不使用 sudo 的情况下运行此命令。

注意: 将 Go 存储在 /usr/local 以外的位置将需要您设置 GOROOT 环境变量。 在 Step 7 中了解有关 Go 环境变量的更多信息。


一旦克隆成功完成,它将在 /usr/local 中创建一个 go 目录。 移动到那个目录。

cd go

在构建之前,我们需要选择我们想要的 Go 版本。

第 5 步 — 选择 Go 版本

对于每个可用版本,Go 源代码都有不同的 Git 分支。 分行名称如下:

  • master 用于开发中的最新版本
  • goversion 用于稳定版本

在这里,我们将使用 Go 1.7.4,这意味着我们要使用 go1.7.4 分支。

警告: 不建议使用开发版(即 Go 的 master 分支)在生产中。 它未经测试,可能存在错误。 开发版本适用于应用程序测试,但仅使用发布版本进行生产。


要更改分支,请使用 git checkout 命令。 您需要以 root 权限运行这些命令,因为 /usr/local/usr/local/go1.4root 拥有。

sudo git checkout go1.7.4

完成此步骤后,您已下载首选版本的 Go 源代码。 您已准备好继续本教程的关键部分:构建 Go 本身。

第 6 步——构建 Go

要构建 go,您需要执行源代码附带的 bash 脚本 src/all.bash。 该脚本将检查您是否拥有所有必要的依赖项、运行一些测试并完成构建。

执行脚本,但请注意,如果您更改了 Go 1.4.3 二进制文件的位置,则需要添加 -E 标志(即 sudo -E bash ./all.bash) 来保存环境变量。

cd src
sudo bash ./all.bash

该脚本将需要很短的时间才能完成。 构建完成后,您将看到以下输出:

Output of src/all.bashALL TESTS PASSED

---
Installed Go for linux/amd64 in /usr/local/go
Installed commands in /usr/local/go/bin
*** You need to add /usr/local/go/bin to your PATH.

警告: 在某些情况下,由于 time 测试失败,Go 1.7 上的构建可能会失败。 这是一个错误的结果。

Failed test output--- FAIL: TestLoadFixed (0.00s)
    time_test.go:943: Now().In(loc).Zone() = "-01", -3600, want "GMT+1", -3600
FAIL
FAIL    time    2.403s
...
2016/12/09 22:16:40 Failed: exit status 1

此问题的解决方法是手动应用错误修复。 为此,请创建一个新分支并选择带有修复的提交。 Git 中的 Cherry Pick 是将来自特定提交的更改应用到您的分支的过程。

此错误已在 commit c5434f2 中修复,因此请将其添加到新创建的分支中。

cd ..
sudo git checkout -b go1.7.4-timefix
sudo git cherry-pick c5434f2973a87acff76bac359236e690d632ce95

完成此操作后,您可以再次运行该脚本。 (如果您移动了 Go 1.4.3 二进制文件,请不要忘记 -E 标志。)

cd src
sudo bash ./all.bash

现在 Go 已经构建好了,你需要为它设置一些环境变量。

第 7 步 — 设置 Go 变量

环境变量是自定义 Go 安装的有效方式。 我们将介绍最重要和最有用的那些。

要开始使用 Go,您需要将 Go 二进制文件路径 /usr/local/go/bin 添加到 PATHGOPATH 环境变量中。 GOPATH 是 Go 应用程序代码和二进制文件的存储位置,我们将其指定为 ~/work,尽管您可以自由自定义它。

将这些变量添加到 ~/.profile 文件中。 用你最喜欢的文本编辑器打开它:

nano ~/.profile

在文件末尾,添加以下行:

~/.profile

. . .
export GOPATH=$HOME/work
export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin

如果您在非默认路径中安装 Go,即 除了 /usr/local/go 之外,您需要定义 GOROOT 变量。 在这种情况下,还要添加以下行:

~/.profile

export GOROOT=$HOME/go
export GOPATH=$HOME/work
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

保存文件并退出。 要使这些更改生效,请刷新您的个人资料。

source ~/.profile

成功完成此步骤后,您就拥有了功能齐全的 Go 安装。 接下来,我们将对其进行测试以确保一切都按预期工作。

第 8 步 — 测试 Go 安装

测试 Go 是否正常工作的一种常见方法是编写并运行一个简单的“Hello, World”应用程序。

为此,首先我们将根据您的 GOPATH 创建并移动到应用程序文件的目录。 你可以在你的 Go 路径中选择你喜欢的任何东西,但作为一个例子,如果你 使用 GitHub 来管理你的代码 ,我们将设置你需要的层次结构。 不过,即使没有 GitHub 帐户,这种层次结构也可以工作。

mkdir -p $GOPATH/src/github.com/your_github_username/test_project
cd $GOPATH/src/github.com/your_github_username/test_project

接下来,创建一个名为 hello.go 的“Hello, World”Go 文件。

nano hello.go

将以下代码添加到文件中:

你好.go

package main

import "fmt"

func main() {
    fmt.Printf("Hello World!\n")
}

本例使用 fmt 包,实现了 Printf() 等 I/O 函数,并定义了 main() 函数,当程序运行时打印 Hello World正在运行。

保存并退出文件,然后使用 Go 命令 install 编译它。

go install github.com/your_github_username/test_project

编译完成后,您可以使用以下命令运行它:

hello

您将看到 Hello World! 打印到终端,这意味着您的 Go 安装正在运行。

第 9 步 — 更改 Go 版本(可选)

本教程设置 Go 1.7.4。 如果要使用不同的版本,则需要更改活动的 Git 分支并重建 Go。

要检查您当前的 Go 版本,您可以使用 go version

go version
Outputgo version go1.7.4 linux/amd64

例如,我们将 Go 版本切换到 1.6.4。 这个版本位于 go1.6.4 分支,所以切换到它。

cd /usr/local/go
sudo git checkout go1.6.4

要确保一切都是最新的,请运行 git pull 以获取所选分支的最新更改。

sudo git pull origin go1.6.4

现在,像以前一样运行构建脚本,如果您在步骤 3 中重新定位 Go 1.4,请确保添加 -E 标志。

cd src
sudo bash ./all.bash

这需要一些时间才能完成。 构建完成后,您将看到以下输出:

Output of src/all.bashALL TESTS PASSED

---
Installed Go for linux/amd64 in /usr/local/go
Installed commands in /usr/local/go/bin
*** You need to add /usr/local/go/bin to your PATH.

您已经在第 5 步中的 ~/.profile 中设置了 Go 变量,所以这就是您更改版本所需要做的一切。

结论

通过从源代码构建并设置路径,您现在拥有开发和测试 Go 应用程序或为 Go 代码库做出贡献的良好基础。

要了解更多信息,您可以探索 如何开始使用 Go如何使用 Martini 为 Go 应用程序提供服务,Martini 是一个 Go Web 框架。 如果您正在寻找为 Go 开源做出贡献的灵感,您可以阅读有关 go-qemu 和 go-libvirt 项目的信息。