GOPATH на Ubuntu: как не сломать себе мозг (и код)
Вы наверняка сталкивались с этим: только что установили Go на Ubuntu, открываете терминал, пишете go run main.go, а в ответ — тишина. Или, что ещё хуже, — красное море ошибок с упоминанием GOPATH. Если вы гуглили эту проблему, то почти наверняка видели тот самый вопрос на Stack Overflow с тысячами просмотров: "How do I SET the GOPATH environment variable on Ubuntu? What file must I edit?". Знакомая боль? Добро пожаловать в клуб.
Я сам когда-то потратил полдня, пытаясь понять, почему Go не видит мои пакеты, хотя я «всё сделал правильно». Спойлер: я сделал неправильно. В этой статье мы разберём топ ошибок при настройке GOPATH на Ubuntu, научимся их избегать и, наконец, настроим окружение так, чтобы оно работало, как швейцарские часы.
Что такое GOPATH и почему он всё ещё важен?
Прежде чем лезть в дебри, давайте вспомним, что такое GOPATH. В мире Go (особенно в версиях до 1.16) это была священная корова. GOPATH — это путь к рабочей директории Go, где хранятся ваши исходники, скомпилированные бинарники и сторонние пакеты. По умолчанию в Ubuntu он устанавливается в $HOME/go, но многие разработчики (особенно те, кто работает с несколькими проектами) меняют его.
С появлением Go Modules (начиная с Go 1.11) потребность в ручном управлении GOPATH снизилась, но она не исчезла полностью. Если вы работаете со старыми проектами, используете go get или просто хотите, чтобы go install складывал бинарники в удобное место — вам всё равно придётся подружиться с этой переменной.
Топ-5 ошибок при настройке GOPATH на Ubuntu
Я собрал самые частые грабли, на которые наступают новички (и не только). Проверьте, не валяетесь ли вы сейчас на одной из этих кочек.
Ошибка №1: Редактирование не того файла
Самый популярный вопрос на Stack Overflow. Пользователи лезут в /etc/environment, /etc/profile или вообще в /etc/bash.bashrc. Да, это сработает, но это плохая практика. Системные файлы — для системных настроек. Ваш GOPATH — личная переменная, и ей место в пользовательских конфигах.
Как правильно: редактируйте ~/.bashrc (для Bash) или ~/.profile (если используете login shell). Если вы на Zsh — это ~/.zshrc.
Ошибка №2: Забыли про экспорт
Часто вижу в конфигах: GOPATH=$HOME/go без export. Без export переменная не будет передана дочерним процессам (в том числе вашей IDE и go build).
Правильный синтаксис:
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
Ошибка №3: Не перезагрузили терминал
Вы отредактировали .bashrc, сохранили, а потом сидите и смотрите на пустой echo $GOPATH. Волшебства не произойдёт, пока вы не примените изменения. Команда source ~/.bashrc — ваш лучший друг.
Ошибка №4: Конфликт с Go Modules
Если вы используете go mod init для каждого проекта, GOPATH может мешать. Особенно если вы пытаетесь работать внутри $GOPATH/src. Современный Go не требует этого, но если вы упорно кладёте проект в ~/go/src/myproject, готовьтесь к неожиданным ошибкам.
Ошибка №5: Пробелы и спецсимволы в пути
Ubuntu позволяет создавать папки с пробелами. Не делайте этого для Go. /home/user/My Projects/go — это головная боль. Используйте /home/user/projects/go или просто $HOME/go.
Пошаговая инструкция: как правильно настроить GOPATH
Давайте сделаем это раз и навсегда. Откройте терминал и выполняйте команды последовательно.
Шаг 1. Проверьте текущую версию Go
go version
Если Go не установлен, ставьте через официальный репозиторий или скачайте бинарник с golang.org.
Шаг 2. Создайте директорию для GOPATH
mkdir -p $HOME/go
Шаг 3. Отредактируйте .bashrc
nano ~/.bashrc
Добавьте в конец файла:
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin
Шаг 4. Примените изменения
source ~/.bashrc
Шаг 5. Проверьте результат
echo $GOPATH
# Должно вывести: /home/ваш_пользователь/go
Шаг 6. Установите что-нибудь для проверки
go install golang.org/x/tools/cmd/...@latest
После этого в $GOPATH/bin появятся бинарники. Проверьте:
ls $GOPATH/bin
Альтернативный подход: используем Go Modules и забываем о GOPATH
Если вы начинаете новый проект сегодня, я настоятельно рекомендую не заморачиваться с GOPATH. Просто создайте папку в любом месте и инициализируйте модуль:
mkdir myproject
cd myproject
go mod init myproject
Всё. Go сам будет управлять зависимостями. Единственное, что вам может понадобиться — это добавить $GOPATH/bin в PATH, чтобы утилиты вроде gopls (языковой сервер) или staticcheck были доступны из командной строки.
Что если я всё сделал, но не работает?
Вот чек-лист для диагностики:
- Проверьте, какой shell вы используете:
echo $SHELL. Если это не bash, редактируйте~/.zshrcили~/.config/fish/config.fish. - Убедитесь, что нет других конфигов: файлы
~/.profileи~/.bash_profileмогут переопределять ваши настройки. - Посмотрите, что говорит
go env: эта команда покажет все переменные окружения Go, включая GOPATH. Если там пусто — вы что-то сделали не так. - Перезагрузите