# Настройка рабочего окружения для работы с Golang
## Настройка Git
```bash
git config --global user.name "My Name"
git config --global user.email m.name@cyrm.ru
```
## Настройка общего окружения
Для начала нужно настроить все пути для утилит и приватных репозиториев:
```bash
# Путь до конфига командной оболочки (обычно это просто ~/.bashrc)
SHELL_RC=~/.$(basename $SHELL)rc
echo "
# Golang environment
export GOPATH=$HOME/go # можно поменять на свой
export GOBIN=$GOPATH/bin # это для утилит, которые ставятся через go install
export PATH=$PATH:$GOBIN # чтобы пользоваться установленными чреез go install утилитами
export GOPRIVATE=$GOPRIVATE,gitlab.cyrm.center
" >> $SHELL_RC # или в ~/.profile
# Применяем окружение к текущей сессии
source $SHELL_RC
```
## Настройка окружения для установки Go зависимостей из наших приватных репозиториев Gitlab
Далее настраиваем авторизованное получение Go репозиториев черз `go get`:
1. Идем в [gitlab.cyrm.center](https://gitlab.cyrm.center/);
3. В верхнем-правом углу кликаем по профилю, далее `Settings` → `Access Tokens`.
4. Создаем себе токен с правами (`api` **или** `read_api` и `read_repository`, и `write_repository`).
---
(**Вариант A**) далее выполняем команды:
```bash
export GLT = "<place your personal gitlab token>"
echo -e "
machine gitlab.cyrm.center
login gitlab-ci-token
password $GLT
" > ~/.netrc
```
---
(**Вариант B**): можно `~/.gitconfig` добавить:
```
# HTTPS
[url https://gitlab-ci-token:{you_gitlab_token}@gitlab.cyrm.center/]
insteadOf = https://gitlab.cyrm.center/
# HTTP
[url http://gitlab-ci-token:{you_gitlab_token}@gitlab.cyrm.center/]
insteadOf = http://gitlab.cyrm.center/`
```
---
По умолчанию рекоммендуется использовать **Вариант A**, т.к. он позволяет получать репозитории из мультигрупп GitLab'а.
Например, [https://gitlab.cyrm.center/rupor/rupor-user-comments.git](https://gitlab.cyrm.center/rupor/rupor-user-comments.git) можно поставить через
```bash
go get gitlab.cyrm.center/rupor/rupor-user-comments.git
```
выбрав любой из вариантов.
Но вот какой-нибудь `https://gitlab.cyrm.center/group1/rupor/rupor-microservice.git` *не* утсановиться, _если_ выбрать **Вариант B** (это баг GitLab'а, который они по политическим причинам не устраняют уже год).
Ну и так проще *Dockerfile* будет выглядеть: одна команда: `COPY ~/.netrc ~/.netrc` и мы можем ставить все зависимости в контейнер через `go mod download`.
Во избежании утечки собственных токенов рекоммендуется, лучше завести сервисного пользователя (без прав на запись в репозитории) и его `.netrc` раздать всем (в какую-нибудь `~/.config/.bot_netrc`) и в `Dockerfile` уже прописывать `COPY ~/.config/.bot_netrc /root/.netrc`.
Либо передавать токен через аргументы в `Dockerfile`:
```dockerfile
FROM golang:alpine AS builder
ARG GITLAB_LOGIN
ARG GITLAB_TOKEN
WORKDIR /app
# Allow pulling private modules
RUN apk add --no-cache git
RUN echo "machine git.petfinder.com login ${GITLAB_LOGIN} password ${GITLAB_TOKEN}" > ~/.netrc
# ...
```
B передавать через
```bash
docker build --build-arg {GITLAB_LOGIN} --build-arg {GITLAB_TOKEN} .
```
---
Есть еще вариант C - через SSH-ключи (возможно, появится тут позже).
## Установка вспомогательного софта:
```bash
go install golang.org/x/tools/cmd/goimports@latest
go install mvdan.cc/gofumpt@latest
```
`gofumpt` - полностью обратносовместнимый форк `gofmt`, только чуть более строгий (важно, когда линтеры не настроены еще);
`goimports` - сортирует импорты по определенным правилам, принятым в командах гугла для удобочитаемости;
### goimports в GoLand
**Для использования вручную**
В контекстном меню (правый клик по коду) в `Go Tools` должна появиться опция `Goimports file`
**Для автоматического запуска**
Для пользователей GoLand можно настроить автоматическую корректировку `goimports`: `File`→`Settings`→`Tools`→`File Watchers`→`+` и выбираем `goimports`.
Далее в Arguments вписываем: `-local gitlab.cyrm.center -w $FilePath$`
Остальные поля оставить без изменений, далее `OK`→`Apply`→`OK`.
## Получение подробных логов работы Go утилит
Для получения подробной информации, почему что-то не ставится через `go get`, например, можно использовать следующие окружения:
* `GIT_SSH_COMMAND="ssh -v" go get/mod/tidy/... ...` - когда пакеты ставятся через SSH и неясно, какие команды использует Go;
* `GIT_TRACE=2 go get/mod/tidy/... # цифра - уровень подбробностей` - когда пакеты ставятся через HTTPS/SSH, но непонятно, какие `git` команды использует Go;