如何在 Ubuntu 16.04 上从源代码构建 Go

介绍

Go是一个现代化的开源编程语言,由谷歌开发,它很简单,具有强大的库和工具,使其容易构建可靠和高效的应用程序。

如果您想对 Go 应用程序进行最新版本的测试,对 Go 代码库做出贡献,或有更好的 Go 版本管理,则需要从源头构建 Go。

前提条件

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

步骤1 - 安装构建依赖

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

1sudo apt-get update

默认情况下,Ubuntu 没有提供构建 Go 所需的所有包,如其编译器、库和工具,很容易通过安装build-essential来安装构建和编译依赖,该包包括构建 C 的gcc,构建 C++ 的g++和构建自动化工具的make

1sudo 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.

您可以在 Go 的下载页面找到与 SHA1 checksums 的二进制程序。 下载名为 go1.4.3.linux-amd64.tar.gz 的文件到您的主目录。

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

虽然这个文件是从真实的来源下载的,但仍然是一个很好的安全实践来验证你下载的内容的完整性. 这是通过比较下载页面上提供的文件哈希和下载的文件哈希最容易做到的。

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

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

将此命令的输出与 Go 下载页面上提供的支票量进行比较。

1[secondary_label Output]
2332b64236d30a8805fc8dd8b3a269915b4c507fe go1.4.3.linux-amd64.tar.gz

如果支票总数匹配,你可以解包文件。

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

),而f允许我们指定F**ilename

Go 1.4 现在被解包在一个名为go的目录中,但 Go 构建脚本默认情况下在~/go1.4中寻找 Go 1.4 二进制。

1mv go go1.4

现在你有必要的依赖性来从源头构建Go. 如果你想将Go 1.4从你的主目录移动到另一个位置,你可以按照下一步。

步骤 3 — 迁移 Go 1.4.3 (可选)

当 Go 构建脚本运行时,它将基于一个名为GOROOT_BOOTSTRAP的环境变量来搜索 Go 1.4. 如果该变量不设置,这是默认的,则构建脚本将假定go1.4目录位于您的主目录中。

首先,移动自己的目录。

1sudo mv go1.4 /usr/local

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

1sudo nano ~/.profile

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

1[label ~/.profile]
2. . .
3export GOROOT_BOOTSTRAP=/usr/local/go1.4

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

1source ~/.profile

接下来,你将克隆 Go 来源。

步骤4 - 获取 Go 来源

Go 二进制存储的推荐位置是 /usr/local,这就是我们将在本教程中使用的。

移动到/usr/local,然后使用Git来克隆存储库。

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

我们需要用根权限执行git clone,因为/usr/local属于 root . 如果您正在克隆 Go 到您的用户有写权限的目录,您可以运行此命令而无需 sudo。

<$>[注] 注: 将 Go 存储到其他位置而不是 /usr/local 将要求您设置 GOROOT 环境变量。 有关 Go 环境变量的更多信息请参阅 步骤 7

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

1cd go

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

步骤5 - 选择 Go 版本

Go 源为每个版本提供不同的 Git 分支,分支的名称如下:

  • 最新的开发版本的master * 稳定版本的government

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

<$>[警告] 警告: 在生产中不建议使用 Go 的开发版本(即)。

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

1sudo git checkout go1.7.4

完成此步骤后,您已下载了您喜爱的版本的 Go 源代码,您已准备好进入本教程的关键部分:构建 Go 本身。

步骤6:建设

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

运行脚本,但请注意,如果您更改了Go 1.4.3二进制的位置,则需要添加)来保存环境变量。

1cd src
2sudo bash ./all.bash

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

1[secondary_label Output of src/all.bash]
2ALL TESTS PASSED
3
4---
5Installed Go for linux/amd64 in /usr/local/go
6Installed commands in /usr/local/go/bin
7*** You need to add /usr/local/go/bin to your PATH.

<$>[警告] 警告: 在某些情况下,由于时间测试失败,Go 1.7 可能会导致构建失败。

1[secondary_label Failed test output]
2--- FAIL: TestLoadFixed (0.00s)
3    time_test.go:943: Now().In(loc).Zone() = "-01", -3600, want "GMT+1", -3600
4FAIL
5FAIL	time	2.403s
6...
72016/12/09 22:16:40 Failed: exit status 1

解决这个问题的解决方法是手动应用错误修复程序. 要做到这一点,创建一个新的分支,并与修复程序一起选择委托程序。

此错误已修复在 commit c5434f2,所以添加到新创建的分支。

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

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

1cd src
2sudo bash ./all.bash

美元

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

第7步:设置变量

环境变量是定制您的Go安装的强大方法,我们将探讨最重要的和最有用的。

要开始使用 Go,您需要将 Go 二进制路径 /usr/local/go/bin 添加到 PATHGOPATH 环境变量中。

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

1nano ~/.profile

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

1[label ~/.profile]
2. . .
3export GOPATH=$HOME/work
4export PATH=$PATH:/usr/local/go/bin:$GOPATH/bin

如果您在非默认路径中安装了Go,即/usr/local/go,则需要定义GOROOT变量。

1[label ~/.profile]
2export GOROOT=$HOME/go
3export GOPATH=$HOME/work
4export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

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

1source ~/.profile

成功完成此步骤后,您将有一个功能齐全的 Go 安装。接下来,我们将测试它,以确保一切按预期工作。

第8步:测试 Go 安装

测试 Go 是否有效的一种常见方法是编写和运行简单的Hello, World应用程序。

要做到这一点,我们首先将创建并移动到基于您的)。

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

然后,创建一个名为hello.goHello, World Go 文件。

1nano hello.go

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

1[label hello.go]
2package main
3
4import "fmt"
5
6func main() {
7    fmt.Printf("Hello World!\n")
8}

本示例使用)等 I/O 函数,并定义了main()函数,该函数在运行程序时会打印Hello World`函数。

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

1go install github.com/your_github_username/test_project

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

1hello

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

步骤 9 – 更改 Go 版本(可选)

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

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

1go version
1[secondary_label Output]
2go version go1.7.4 linux/amd64

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

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

要确保一切都处于最新状态,请运行git pull以获取所选分支机构的最新更改。

1sudo git pull origin go1.6.4

现在,像以前一样运行构建脚本,确保在步骤 3 中移动 Go 1.4 时添加-E旗。

1cd src
2sudo bash ./all.bash

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

1[secondary_label Output of src/all.bash]
2ALL TESTS PASSED
3
4---
5Installed Go for linux/amd64 in /usr/local/go
6Installed commands in /usr/local/go/bin
7*** You need to add /usr/local/go/bin to your PATH.

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

结论

通过从源头构建和设置路径,您现在可以开发和测试Go应用程序或为Go代码库做出贡献。

为了多学习,可以探索[如何从Go开始(https://www.digitalocean.com/company/blog/get-your-development-team-started-with-go/)或[如何用Martini服务Go应用程序(https://andsky.com/tech/tutorials/how-to-use-martini-to-serve-go-applications-behind-an-nginx-server-on-ubuntu),这是一个Go网络框架. 如果您正在寻找灵感为Go开放源代码做出贡献,您可以读取有关go-qemu和go-libvirt项目的内容.

Published At
Categories with 技术
comments powered by Disqus