Сборка 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.
Читайте также:
- Обслуживание Go-приложений при помощи Martini на сервере Nginx в Ubuntu
- Разработка в Go: полезные советы для новичков
- Использование go-qemu и go-libvirt
1 комментарий
Спасибо за прекрасную статью!
Все сделал, все получилось!
А как можно бинарный файл hello из пункта 8 запускать из crontab?