Перейти к основному содержимому

Настройка GoLand

Обычный elc start поднимает контейнер, внутри которого работает air: он перекомпилирует и перезапускает сервис при изменении кода. В таком режиме удобно жить день за днём, но отладчик GoLand к процессу не подключить. Ниже — как завести отдельные конфигурации Run/Debug через Docker Compose, гонять тесты и при необходимости возвращаться к elc start одной кнопкой.

Скриншоты сняты на примере Go-сервиса; пути в External Tools и Working directory подставьте под свой репозиторий. Скрипты scripts/dump-compose.sh и scripts/clean-orphan.sh лежат в корне Go-сервисов Ensi.

Запуск для отладки

Справа сверху — меню выбора таргета сборки/запуска и кнопки Run / Debug. Откройте настройку таргета через Edit Configurations….

Меню Edit Configurations

Добавьте новую конфигурацию типа Go Build.

Добавление Go Build

Дайте таргету имя (например Debug) и прокрутите окно до секции Before launch. Через + → Run External tool добавьте команды, которые выполнятся до старта отладки.

Before launch → Run External tool

Первая команда — остановка текущего сервиса в ELC, чтобы не было конфликта портов и контейнеров:

External tool: elc stop

  • Name: Stop ELC
  • Program: elc
  • Arguments: stop
  • Working directory: корень сервиса

Вторая команда — скрипт, который дампит docker-compose.yml для GoLand (файл появится в ./build/docker-compose.yml):

External tool: dump-compose.sh

  • Name: dump-compose
  • Program: путь к scripts/dump-compose.sh в корне сервиса
  • Working directory: корень сервиса

Третья — scripts/clean-orphan.sh: находит завершённые one-off контейнеры Docker Compose (docker compose run) и удаляет их. Это workaround: GoLand создаёт служебный контейнер /bin/true без --rm, и он остаётся orphan.

External tool: clean-orphan.sh

В Before launch в итоге должны быть три инструмента: Stop ELC, dump-compose, Clean Orphan.

Дальше смените способ запуска: вместо Local machine выберите Docker Compose.

Смена Run on с Local machine

В окне таргета укажите путь к compose-файлу, который кладёт скрипт: ./build/docker-compose.yml, сервис обычно app.

Путь к docker-compose.yml

В конфигурации Go Build включите обе галочки: Build on remote target и Run after build.

Build on remote target и Run after build

Сохраните конфигурацию и запускайте сервис кнопками Run и Debug. Сервис будет доступен в браузере и для соседних сервисов воркспейса как обычно. При изменении кода его нужно перезапускать вручную — hot-reload через air в этом режиме не работает.

Запуск Go Test

Настраивается так же, как отладка: вместо Go Build выбираете Go Test, Run on — тот же Docker-таргет app, с включённым Build on remote target.

Конфигурация Go Test

Такая конфигурация гоняет сразу все тесты проекта (или выбранной директории). Часто нужен один конкретный тест кнопкой у номеров строк. Для этого у таргета сборки (Docker Compose / app) выставьте, что он используется по умолчанию для проекта:

Project default target

Кроме того нужно отредактировать файл .idea/workspace.xml - почему-то опция Build on remote target недоступна для дефолтной конфигурации через UI, так что нужно её включить через правку кофнига.
Для этого ищем в вышеуказанном файле строку (важно чтобы было default="true")

<configuration default="true" type="GoTestRunConfiguration" factoryName="Go Test">

и добавляем внутрь этого тэга такую строку

<option name="build_on_remote_target" value="true" />

После этого отдельный тест нормально стартует из редактора:

Запуск одного теста из gutter

Запуск ELC-сервиса по кнопке

Чтобы после остановки отладки быстро вернуть сервис в режим air/reload, заведите таргет типа Shell Script с командой elc start.

Добавление Shell Script

Конфигурация elc start

  • Name: например ELC
  • Script text: elc start
  • Working directory: корень сервиса
  • Execute in the terminal: включено

Запуск сервиса вне контейнера

Если нужно гонять процесс на хосте, создайте таргет Go Build почти без изменений. В .env сервис обычно слушает порт 80 (так удобнее в сети воркспейса), а на хосте этот порт без root недоступен — переопределите его в Environment, например APP_PORT=8080:

Local с APP_PORT=8080

Закрепление основных конфигураций

IDE сама плодит конфигурации при запуске тестов или HTTP-клиента. Чтобы ручные таргеты (Docker, ELC, Local и т.п.) не терялись в списке, закрепите их: три точки напротив конфигурации → Pin.

Pin конфигурации