⚠️ Обращайте внимание на даты.
Этот блог больше не ведётся с 17 января 2023, и на тот момент с написания этой страницы (14.04.2016) прошло 6 лет.
На работе поднялся вопрос о том, как собрать адекватную среду разработки на языке Go (или Golang), активно развиваемом Google. Посему, этот пост предназначается больше моим коллегам. Мне уже приходилось писать на Go небольшую (<100 строк, но при этом полезную) программку для рабочих нужд, поэтому как собрать приличную среду разработки, я уже представлял. Единственное, чего не хватало, это отладчика. Но без него я обходился настолько долго, что написанная программка стала не нужна (хи-хи) и дальнейшая деятельность в этом направлении была свёрнута. В качестве основы для среды будет использован Atom.
Условия эксперимента
Чтобы было совсем честно, я сделал чистую виртуальную машину в VirtualBox. 2 Гб оперативной памяти, 20 Гб жёсткого диска, наверняка с запасом.
Установил я туда Xubuntu 15.10, Wily Werewolf на русском. Примерно то же самое я проделал ранее на LMDE2 (Linux Mint Debian Edition), а значит это наверняка сработает на Debian 8 (Jessie) и производных Debian, в т. ч. Ubuntu.
После установки я обновился. По привычке. В данном случае это могло быть необязательно и только сделало процедуру дольше.
Большая часть команд будет вводиться в эмулятор терминала, вызываемый по Ctrl+Alt+T.
Поехали!
Итак, загрузились в свежеустановленный Xubuntu. Идём в Firefox, на сайт Atom и скачиваем оттуда установщик. Просто скачиваем, просто устанавливаем, всё как обычно. Никаких приключений.
Затем в терминале устанавливаем Git… стоп, он уже установлен. Окей, двигаем дальше.
Теперь ставить сам Go.
Зная необходимость для разработчика иметь в одной системе несколько версий компилятора для комфортной проверки совместимости, стоит сразу задуматься о менеджере версий. Такие инструменты есть для Ruby и NodeJS, и я подозревал, что для Go такое тоже есть. И да! Знакомьтесь, GVM.
Вообще в репозиториях Debian есть Go (пакет golang
и вариация на GCC, gccgo
), и очень может быть, что достаточно установить его и задать $GOPATH
, но особых трудностей в этом нет, рассмотрим сценарий посложнее и погибче, размещённый целиком в домашней папке.
В Ubuntu/Debian нужно установить зависимости (секция Linux Requirements), затем установить GVM (секция Installing). Система попросит открыть новую терминальную сессию, чтобы GVM можно было начать использовать. Это потому, что GVM вмешивается в процесс включения оболочки, закидывая в PATH
пути к исполняемым файлам Go выбранной в GVM версии.
Теперь занимательная историческая деталь. Ранние версии Go написаны на C++, компиляторы которого есть в любом уважающем себя дистрибутиве Linux. Но начиная с версии 1.5 компилятор Go написан на Go. Поэтому сходу собрать последнюю версию Go из исходников (что и делает GVM) не выйдет! Компилятор Go же нужно где-то взять. Предполагается, что он будет распространяться в уже скомпилированном виде. Если не покидать пределов GVM, то придётся устанавливать Go <1.5 (1.4.3 на момент написания), выбрать его, затем им установить Go 1.6.1 (последняя на данный момент), выбрать его, как Go по умолчанию и удалить <1.5 следующей… довольно понятной даже на вид последовательностью команд:
Напоследок, установим Delve, отладчик. Должно хватить одной команды go get
:
Если утилита молча поработала и завершилась, всё хорошо.
А что в Atom?
У Atom есть свой менеджер пакетов, apm
, который можно дёргать, не открывая сам Atom. Этим и воспользуемся, установим в него пару нужных пакетов прямо из терминала:
В целом, всё. Можно пользоваться.
Пошли пробовать!
В среде Go принято держать “единое дерево пакетов”, и даже разработку собственных пакетов вести в нём же. Дерево располагается по пути в $GOPATH
, эту переменную выставляет GVM. Сходим туда, сделаем там папку для нового пакета (возможно, вы захотите заменить username
на свой логин на GitHub) и запустим в ней Atom:
Обращаю внимание, что при работе с GVM (без доп. настройки) Atom необходимо запускать из терминала (на манер описанного выше), чтобы изменения в PATH
подхватывались. Если запустить его из меню, он будет жаловаться, что не видит Go. Возможно, это чинится очень просто, но я рассматривал этот вопрос.
Atom встретит парой уведомлений в уголке о том, что он занимается доустановкой зависимостей. Процесс почти автоматизирован. В процессе и далее при первых использованиях инструментов для Go он будет предлагать кнопку Run Go Get, чтобы установить какой-нибудь недостающий пакет в Go.
Дождитесь, пока дела завершатся (позеленеют), позакрывайте вкладки “добро пожаловать!” (несколько нажатий Ctrl+W или мышью), и сделайте новый файл (Ctrl+N или мышью File->New File). В меню за Ctrl+Shift+L включите синтаксис Go
.
Напишите в файле следующее:
Обращаю внимание, что эта программа не скомпилируется! Так сделано намеренно. После сохранения под именем hello.go
(Ctrl+S) среда сама должна привести программу в порядок, добавив import
– мы же хотим удостовериться, что всё работает. Но поскольку вы это делаете впервые, вам придётся установить соответствующие пакеты для Go. Atom сам это предложит в уведомлениях. Когда всё установится, сохраните файл ещё раз, чтобы файл обработался всем свежеустановленным.
Теперь к отладчику. Слева от номеров строк можно щёлкнуть, чтобы поставить точку останова. По какой-то причине для них не было отведено место и мне пришлось закрыть вкладку и открыть файл снова, чтобы место образовалось.
Поставьте точку останова на строчке с fmt.Println
(у меня она стала седьмой), нажмите в отладчике Debug
и на треугольную стрелочку вправо (“Continue”). В списках под кнопками сразу полезет информация о текущем состоянии программы.
Всё! Оставляю вас поиграться :)
`
Развлекайтесь!
Обживайтесь в Атоме, для него существует гигантское количество пакетов, хотя далеко не для всех языков есть настолько проработанные, как для Go.
Пошарьтесь по настройкам, выставьте на свой вкус и цвет, установите себе тему оформления и синтаксиса, свой любимый шрифт, установите ещё какие-нибудь пакеты, интересных много. Необязательно через apm
, можно просто из меню настроек (Ctrl+,).
Что касается Windows
Я провернул почти всё это на Windows 10 с установленным MSYS2. MSYS2 это очень мощная вещь, в которой есть pacman
, менеджер пакетов, используемый в Arch Linux. Никогда им не пользовался, но свою задачу он выполняет и я им доволен. Изначально я его ставил ради Git, но оказалось, что там есть и другие весьма полезные вещи, скажем, zsh
. Да, в Windows. Да, oh-my-zsh
там работает. Нет, объявление Microsoft об интеграции Linux-подсистемы тут ни при чём, оно работало месяц назад на стабильном выпуске Windows 10 :)
.
Единственное, что пришлось подредактировать $PATH
, чтобы в нём были:
- Бинарники Go (
C:\Go\bin
): дистрибутив Go, устанавливаемый с официального сайта. Этот путь прописывается куда надо самостоятельно при установке Go, но я умудрился в процессе настройки его ненароком стереть. Интерфейс не очень удобен :) - Бинарники среды Go (развёрнутый
$GOPATH\bin
, в моём случаеC:\GoEnv\bin
): туда кладутся исполняемые файлы от пакетов Go, которые устанавливаетgo get
. К концу процесса там должно оказаться чуть больше двух десятков исполняшек, большая часть которых это статические анализаторы кода, но также отладчик и форматировалка. - Бинарники MSYS2 (
C:\msys64\usr\bin
):go get
очень хотелgit
, вPATH
на MSYS2 он был (установлен путёмpacman -S git
), а в системном не было. Кстати, наличие этой папки в системномPATH
может привести к конфликтам, там очень много программ, целая Unix-подобная среда. Если у вас возникнут подозрения, что что-то “третье” у вас запускает явно не то, что ожидает, попробуйте эту папку вычеркнуть изPATH
. Лично я с этим не сталкивался, но вам стоит знать, куда смотреть в случае странностей.
После этого вы просто запускаете Atom откуда хотите (никаких фокусов с GVM) и всё просто работает. Восхитительно.
Хочется верить, что…
Сообщество Atom всё-таки сможет сделать общий интерфейс для отладчиков. У них получилось это сделать для линтеров (анализаторов) и автодополнения. Над отладчиками прогресса пока нет, но усилия прикладываются.