Какой смысл переменных окружения GOENV и GOPROXY
Что проверяют
Понимаете ли вы, откуда команда go берёт настройки и как скачиваются модули. Особенно это важно там, где есть приватные репозитории и корпоративный прокси. Следом почти всегда спрашивают про GOPRIVATE и почему приватный модуль не скачивается.
Как отвечать
Начните с того, что это переменные самого тулчейна, а не конфигурация вашего приложения.
- GOENV: путь к файлу, куда
go env -wзаписывает настройки. По умолчанию этоgo/envв пользовательском каталоге конфигурации:~/.config/go/envв Linux,~/Library/Application Support/go/envв macOS. ЗначениеGOENV=offотключает файл. СамуGOENVчерезgo env -wзадать нельзя, только переменной окружения; - порядок приоритета: переменная окружения процесса сильнее файла из
GOENV, а тот сильнее$GOROOT/go.env, где начиная с Go 1.21 лежат умолчания тулчейна; - GOPROXY: список адресов модульных прокси. По умолчанию
https://proxy.golang.org,direct.directозначает идти прямо в VCS,offзапрещает скачивание вообще. При разделителе запятой переход к следующему варианту происходит только на 404 и 410, при|на любую ошибку; - GOPRIVATE: шаблоны путей приватных модулей, например
gitlab.example.ru/*. Задаёт умолчания дляGONOPROXYиGONOSUMDB, поэтому такие модули идут мимо публичного прокси и мимо проверки черезsum.golang.org.
В компании обычно ставят свой прокси (Athens, Nexus, Artifactory): он кеширует модули, переживает удаление репозитория автором и работает там, где внешний интернет закрыт. В CI настройки задают переменными окружения пайплайна, а не через go env -w на машине сборки.
Где спотыкаются
Описывают GOENV как способ переключать настройки приложения между dev и prod. Файл влияет только на команду go.
Делают go env -w GOPROXY=..., а в шелле экспортирована та же переменная. Побеждает окружение, и человек не понимает, почему настройка не применилась. Проверить итоговое значение помогает go env GOPROXY.
Не задают GOPRIVATE. Тогда запрос уходит в публичный прокси и в sum.golang.org, проверка контрольной суммы падает, а путь внутреннего репозитория уже ушёл наружу.