# 17 - ЕЖЕДНЕВНАЯ ПОЧТА

Полная среда разработки Go с Docker и VS Code

Статья №3 в серии Go RESTful

В прошлый раз я создал простой скрипт, запускающий контейнер Docker, который может синхронизировать и выполнять исходный код Go с моей локальной машины. Но я еще не объяснил, как поддерживать IntelliSense и отладку, которые имеют решающее значение для разработки. Давайте сделаем это в этой статье.

Соображения

Я немного волновался, когда исследовал решения для этой цели, потому что это сильно зависит от поставщиков редакторов кода / IDE, которые нормально работают с контейнером. К счастью, есть два популярных редактора, поддерживающих именно это: GoLand и VS Code.

Поддержка GoLand выглядит довольно зрелой, потому что она существует уже некоторое время (происходит от IntelliJ). Однако эта функция доступна только в купленной версии.

Расширение VS Code Remote-Containers было выпущено совсем недавно, поэтому оно не так развито, как GoLand. Тем не менее, расширение официально разработано и поддерживается Microsoft (не с открытым исходным кодом) и планируется использовать во многих будущих сервисах в качестве сопутствующей веб-среды IDE или облачной IDE, так что это очень многообещающе. На момент написания этой статьи набор функций выглядел достаточно хорошо для начала. Пойдем с VS Code.

Судя по всему, мы можем использовать Vim прямо в контейнере и устанавливать в него классные плагины. Однако это будет мой последний дубль, потому что я установил это не только для себя, но и для своей команды (и для вашей тоже), а процесс обучения Vim очень тяжел для большинства разработчиков.

Удаленные контейнеры VS Code

Концепция

VS Code Remote-Containers - это расширение, которое помогает разработчикам работать со своим пользовательским интерфейсом VS Code в обычном режиме, но все команды и действия распространяются и выполняются внутри контейнера. На самом деле это похоже на то, что вы загружаете TeamViewer в контейнер и используете в нем VS Code.

Реализация VS Code достаточно сильна и абстрактна, чтобы большинство расширений работало как есть.

С помощью этой концепции мы можем контейнеризовать среду практически для любого типа разработки, не только для Go.

Рецепт приготовления

Установите расширение VS Code Remote-Containers.

Напишите Dockerfile описание вашего образа с пакетами и инструментами, необходимыми для запуска и отладки вашего приложения.

Создайте .devcontainer.json в корне рабочего пространства (рядом с .vscode), ссылаясь на Dockerfile.

{
   "dockerFile": "Dockerfile",
   "extensions": [ 
      "ms-vscode.go" 
   ]
}

Откройте папку, содержащую ваш .devcontainer.json файл, с помощью VS Code. VS Code автоматически обнаружит это и попросит вас открыть проект в режиме контейнера.

Затем VSCode построит ваш образ на основе вашего Dockerfile (только в первый раз) и настроит некоторые дополнительные необходимые пакеты, чтобы он мог работать в контейнерах.

После завершения процесса вы теперь можете использовать VS Code как обычно, и все фактически запускается внутри контейнера.

Как и в приведенном выше примере, у меня даже нет go среды выполнения на моем локальном компьютере, но я все еще могу выполнять код Go из моего VS Code и могу получить доступ к серверу из Safari. Все делается внутри контейнера.

Реализация

Следуя концепции и рецепту, упомянутым выше, я создал Dockerfile.

Образ основан на официальном образеgolang, поэтому он может правильно поддерживать go. Затем я установил некоторые инструменты, необходимые для расширения Go VS Code, чтобы иметь возможность использовать функции IntelliSense, линтинга и отладки.

Затем я написал .devcontainer.json файл.

Он просто ссылается на мой Dockerfile и перечисляет все расширения, которые VS Code должен установить в прикрепленные контейнеры. Он также устанавливает сопоставление портов с моего локального компьютера на мой контейнер и наоборот, поэтому я могу тестировать свое приложение прямо из браузера.

Результат

Мне удалось написать код со всеми функциями IntelliSense, такими как автозаполнение, автоматический импорт, навигация по коду и т. Д.

Мне удалось запустить приложение без установки среды выполнения Go на моем локальном компьютере. Благодаря сопоставлению портов я также могу тестировать свое приложение в Safari.

Я смог использовать потрясающие функции отладки, поддерживаемые расширением Go VS Code.

Ограничения

У меня почти есть все, что мне нужно; однако есть некоторые ограничения, которые меня немного раздражают:

  • Мне пришлось немного поработать, чтобы иметь возможность использовать команду VS Code git push, потому что для этого требуются мои учетные данные SSH, привязанные к контейнеру.
  • Мне не удалось подписать GPG свою фиксацию с помощью команды VS Code git commit, потому что для пересылки команд GPG из контейнеров на хост-компьютер требуется довольно много работы.

Подвести итог

Хотя все еще есть некоторые ограничения, я смог разрешить эпопею, определенную здесь, и у меня была постоянная контейнерная среда разработки с опытом разработки местного качества.

Спасибо Microsoft за такую ​​спасительную функцию!

Полный исходный код статьи опубликован здесь.