如何在Ubuntu16.04上从源代码构建Go
介绍
Go 是一种由 Google 开发的现代开源编程语言。 它很简单,并且有一套强大的库和工具,可以轻松构建可靠和高效的应用程序。
如果您想针对最新版本的语言测试您的 Go 应用程序、为 Go 代码库做出贡献或拥有更好的 Go 版本管理,您需要从源代码构建 Go。 本教程将向您展示如何构建 Go,涵盖一些实际考虑因素,并构建一个“Hello, World”测试应用程序。
先决条件
要遵循本教程,您将需要:
- 按照 使用 Ubuntu 16.04 的初始服务器设置教程 设置一台至少 1GB 内存的 Ubuntu 16.04 服务器,包括 sudo 非 root 用户和防火墙。
- Git 安装在您的服务器上,您可以按照 this Git installation tutorial for Ubuntu 16.04 进行设置。
- (可选)一个 GitHub 帐户。
第 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/local
由 root 拥有。 如果您正在克隆转到您的用户具有写入权限的目录,则可以在不使用 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.4
由 root 拥有。
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
添加到 PATH
和 GOPATH
环境变量中。 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 项目的信息。