Сборка Go из исходного кода в Ubuntu 16.04

Go – это современный язык программирования с открытым исходным кодом, разработанный компанией Google. Он прост в работе и предоставляет набор надёжных библиотек и инструментов, которые позволяют быстро собрать производительное приложение.

Если вы хотите протестировать последнюю версию языка Go, поучаствовать в его разработке или улучшить управление версиями Go, вы должны собрать Go из исходного кода. Данное руководство поможет скомпилировать Go и создать тестовое приложение «Hello, World».

 Требования

  • Сервер Ubuntu 16.04 (руководство по начальной настройке можно найти здесь).
  • 1Гб памяти минимум.
  • Предварительно установленная система контроля версий Git (чтобы установить Git, следуйте этому руководству).
  • Аккаунт GitHub (опционально).

1: Установка зависимостей

Обновите индекс пакетов:

sudo apt-get update

Теперь можно приступать к работе. По умолчанию Ubuntu предоставляет не все пакеты, которые понадобятся для компиляции Go. Но зависимости сборки легко установить: все они содержатся в пакете build-essential. Этот пакет включает в себя gcc для компиляции C, g++ для компиляции C++ и инструмент автоматизации сборки make.

sudo apt-get install build-essential

После окончания установки у вас будут все необходимые инструменты.

2: Установка Go 1.4.3

Чтобы скомпилировать Go 1.5+, нужно сначала установить Go 1.4, потому что инструменты связывают эти версии между собой. Вы можете использовать любой релиз этой версии (Go 1.4.1, 1.4.2, or 1.4.3). В этом руководстве используется 1.4.3.

Бинарные файлы Go и контрольную сумму SHA1 можно найти на сайте 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.

332b64236d30a8805fc8dd8b3a269915b4c507fe  go1.4.3.linux-amd64.tar.gz

Если значения совпадают, распакуйте архив:

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

Флаг x извлекает файлы, v выдаёт расширенный результат, а f задаёт имя файла.

Файлы Go 1.4 извлечены в каталог go, но сценарий сборки Go будет искать их в каталоге ~/go1.4. Переименуйте каталог с помощью mv.

mv go go1.4

Теперь все зависимости установлены, и всё готово к сборке исходного кода Go.

Примечание: Если вы хотите переместить файлы Go 1.4 в домашний каталог, выполните следующий раздел, если нет – пропустите его.

3: Перемещение Go 1.4.3 (опционально)

После запуска сценарий сборки Go будет искать Go 1.4 в переменной среды GOROOT_BOOTSTRAP. Если переменная не установлена (обычно она установлена по умолчанию), сценарий будет искать каталог go1.4 в домашнем каталоге. Используйте переменную GOROOT_BOOTSTRAP, если вы хотите переместить Go 1.4 в другое место. Для примера мы переместим файлы в /usr/local/go1.4.

Сначала переместите сам каталог:

sudo mv go1.4 /usr/local

После этого нужно установить путь к каталогу в файле ~/.profile.

sudo nano ~/.profile

Найдите в конце такую строку:


export GOROOT_BOOTSTRAP=/usr/local/go1.4

Укажите в ней путь к каталогу. Сохраните и закройте файл. Обновите настройки:

source ~/.profile

Теперь нужно клонировать исходный код Go.

4: Загрузка исходного кода Go

Бинарные файлы Go рекомендуется хранить в /usr/local (как в этом руководстве), но вы можете хранить их где угодно.

Перейдите в /usr/local и клонируйте репозиторий с помощью Git.

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

Команду git clone нужно выполнять с привилегиями root, потому что /usr/local принадлежит root. Если вы копируете файлы в каталог, в котором пользователь имеет право на запись, можете запустить команду без sudo.

Примечание: Если файлы Go хранятся не в /usr/local, а в другом каталоге, установите переменную GOROOT. Подробнее о переменных Go – в разделе 7 данного руководства.

После того как клонирование будет успешно завершено, в /usr/local появится каталог go. Откройте его:

cd go

Теперь нужно выбрать версию Go.

5: Выбор версии Go

Исходный код Go хранится в нескольких отдельных ветках Git. Ветки называются:

  • master – последняя версия в разработке.
  • goversion – стабильные версии.

Чтобы загрузить Go 1.7.4, нужно использовать ветку go1.7.4.

Важно! В производстве не рекомендуется использовать версии Go, находящиеся в разработке (т.е. ветку master). Такие версии не протестированы и могут содержать баги. Версии ветки master хорошо подходят для тестирования приложений, но не для производства.

Чтобы изменить ветку, используйте команду git checkout. Её нужно запускать с правами root, поскольку каталоги /usr/local и /usr/local/go1.4 принадлежат пользователю root.

sudo git checkout go1.7.4

Теперь всё готово к сборке Go.

6: Сборка Go

Чтобы собрать Go, нужно выполнить сценарий bash, src/all.bash, который поставляется вместе с исходным кодом. Сценарий проверит наличие всех зависимостей, протестирует некоторые компоненты и закончит сборку.

Выполните сценарий, но имейте в виду: если вы переместили бинарные файлы Go 1.4.3, нужно добавить в команду флаг –E, чтобы сохранить переменные среды (например, sudo -E bash ./all.bash).

cd src
sudo bash ./all.bash

Выполнение сценария не займёт много времени. После завершения сборки на экране появится:

ALL 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.

Важно! В некоторых случаях в сборке Go 1.7 происходят сбои из-за ошибки в time_test. Это результат бага.

--- 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

Эту ошибку можно устранить. Для этого нужно вручную исправить баг. Создайте новую ветку и добавьте в неё коммит с исправлением. Этот баг исправлен в коммите c5434f2.

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

После этого перезапустите сценарий (если вы переместили файлы Go 1.4.3, добавьте флаг –Е).

cd src
sudo bash ./all.bash

Сборка завершена; теперь нужно добавить переменные среды.

7: Переменные Go

Переменные среды позволяют выполнить пользовательскую настройку Go.

Чтобы начать работу с Go, добавьте путь к бинарным файлам (/usr/local/go/bin) в переменные PATH и GOPATH. В переменной GOPATH хранятся код приложения и бинарные файлы Go (в руководстве будет использоваться путь ~/work, но вы можете указать другой путь).

Добавьте эти переменные в ~/.profile. Откройте файл:

nano ~/.profile

Добавьте в конец файла следующие строки:

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

Если вы используете нестандартный путь для установки Go (не /usr/local/go) определите переменную GOROOT. в таком случае нужно добавить также строки:

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

Сохраните и закройте файл.

Обновите настройки:

source ~/.profile

Если все переменные определены правильно, установка Go готова к работе.

8: Тестирование Go

Чтобы протестировать Go, создайте простое приложение «Hello, World».

Создайте и откройте каталог для файлов приложения (путь будет зависеть от GOPATH). В качестве примера создадим иерархию, которая позволит использовать 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.

nano hello.go

Добавьте в файл следующий код:

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

Этот код использует пакет fmt, который выполняет функции ввода/вывода (например Printf()), и определяет функцию main(), которая выводит на экран Hello World.

Сохраните и закройте файл, а затем скомпилируйте его при помощи команды install.

go install github.com/your_github_username/test_project

Чтобы запустить приложение, введите:

hello

Если всё было выполнено правильно, на экране появится:

Hello World!

9: Изменение версии Go (опционально)

В данном руководстве используется Go 1.7.4. Если вы хотите использовать другую версию, измените активную ветку Git и повторно соберите Go.

Чтобы узнать текущую версию Go, используйте:

go version
go version go1.7.4 linux/amd64

Для примера попробуйте перейти к версии 1.6.4, которая находится в ветке go1.6.4.

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

Обновите ветку с помощью команды:

sudo git pull origin go1.6.4

Запустите сценарий сборки (помните про флаг –Е).

cd src
sudo bash ./all.bash

На сборку уйдёт некоторое время. В результате на экране появится:

ALL 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.

Переменные среду уже установлены в ~/.profile, так что больше ничего делать не нужно.

Заключение

Теперь вы умеете собирать Go из исходного кода, а это предоставляет вам широкие возможности для разработки и тестирования приложений Go. Также теперь вы можете сделать свой вклад в базу кода Go.

Читайте также:

Tags: , , , ,

1 комментарий

Добавить комментарий