Привет, Хабр!
Вы устали иметь дело со сломанными Swift проектами через несколько месяцев после их создания? Каждый раз мучаетесь с настройкой Swift окружения, нюансами под каждую платформу и страдаете от засорения системы кучей устанавливаемых компонентов? Или просто интересуетесь тем как попробовать Swift для разработки за пределами экосистемы Apple? Тогда добро пожаловать под кат, будет интересно!

TL;DR отличная IDE для комфортной разработки на Swift, ставьте из маркетплейса
Swift был выпущен в 2014 году, тогда же я и влюбился в него с первого взгляда. В 2016 его исходный код выложили на GitHub под лицензией Apache 2.0 и началась интересная движуха по использованию его во всем чем только можно за пределами macOS и Obj-C.
С тех пор прошло много лет, на Swift можно писать производительный бэк, веб-приложения, прошивки для микроконтроллеров, UI под различные платформы и много всего другого.
Но даже сейчас для большинства Swift считается языком чисто для разработки под Apple, и что он живёт только внутри Xcode, а значит чтобы поиграться с языком нужно покупать мак.
А что, если я скажу, что всё это не так, и Swift живёт сам по себе вне Xcode, а писать на нём можно хоть на линуксе, хоть на винде?
Возможно вы и раньше слышали, что стоит попробовать Swift, но, предположу, что вы сталкивались со сложными инструкциями, и даже если и настраивали всё как надо, то не было окружения с подсветкой кода и автокомплитом, что сразу сводило весь энтузиазм на нет.
Моя задача принести свет: обойти все сложности настройки окружения и привести вас сразу к интересной работе с кодом.
Есть хорошая фраза "let's give it some love" и это как раз то, что я решил сделать
Для этого в 2024 году я выбрал путь создания IDE, которая будет заточена на работу исключительно в докер-контейнерах, чтобы всё само настраивалось в один клик и с течением времени оставалось неизменным.
Так родилось расширение Swift Stream IDE для VSCode. Вы спросите: а как расширение может считаться IDE, ведь обычно IDE это целая отдельная программа? Но ведь расшифровывается эта аббревиатура как Integrated Development Environment, а VSCode это просто текстовый редактор, и если сделать расширение которое из этого текстового редактора делает полноценное интегрированное окружение для разработки, то его можно смело называть IDE.
В этой публикации мы поговорим о том где Swift живёт на самом деле, для чего можно его использовать в наши дни, и как с помощью интегрированной в VSCode среды разработки попробовать Swift на деле сегодня.
Swift внутри Xcode?
Это от части может быть правдой, потому что основной IDE для Swift всегда был Xcode. Те, кто работали с ним долгие годы могут как иметь теплые чувства, так и тихо его ненавидеть за всё что с ним случалось: от пропадания автокомплита, до утечек памяти на десятки гигабайт. Тем не менее хорошей приятной альтернативы не было (AppCode не в счёт).
Сам по себе Swift поставляется в наборе инструментов разработки (toolchain), который официально доступен для macOS, Windows и множества Linux.
На macOS обычно устанавливают Xcode, вместе с которым автоматом устанавливается Swift, а его версия привязывается к версии Xcode. Соответственно в дальнейшем Swift обновляется вместе с Xcode, отсюда и все ощущения того, что язык живёт исключительно внутри него. Но также можно скачать установочный пакет Swift отдельно со swift.org или через консольную утилиту swiftenv или новую официальную swiftly.
На альтернативных операционных системах Swift всегда устанавливается отдельно в несколько консольных команд описанных на swift.org.
Хотя Swift это и отдельная сущность и на macOS можно устанавливать различные его версии, но если вы любите исключительно Xcode, то рано или поздно столкнетесь с тем, что по какой-то загадочной причине в самом Xcode жестко зашит SwiftPM (менеджер пакетов) именно той версии Swift которая шла в комплекте.. а значит даже переключив тулчейн вы просто не сможете, например, полноценно поиграться с проектом на Swift 6.3 если у вас Xcode для Swift 6.2. Но в консоли или в стороннем редакторе, например в VSCode, сможете.
Набор инструментов для разработки это множество утилит и сервисов которыми можно пользоваться как из различных редакторов, так и вручную в консоли. Автокомплит и подсветка кода реализованы через классический LSP сервис, а значит за пределами Xcode тоже есть комфортная жизнь.
Официально Swift поддерживается только в Xcode и VSCode. До 2025 Swift расширение для VSCode было в разработке у Swift Server Work Group, но оно работало нестабильно и радости от разработки приносило значительно меньше чем Xcode. С января 2025 расширением стала заниматься новая команда от swift.org, которая переработала расширение и UX в VSCode наконец-то сравнялся с Xcode, а на мой взгляд стал даже лучше.
Где Swift используется сегодня?
В 2016 году когда Swift заопенсорсили и запустили на Linux, это открыло новые горизонты и множество разработчиков стали его пробовать в различных направлениях, например для разработки серверных приложений. В то время я вступил в команду серверного фреймворка Vapor и активно стал развивать как можно больше жизненно необходимых библиотек для наполнения серверной экосистемы Swift, но об этом в другой публикации.
На сегодняшний день на Swift мы можем разрабатывать:
приложения для Apple платформ в Xcode (ваш кэп)
производительные серверные приложения на Vapor и Hummingbird
GUI приложения для Linux, Windows и Android
WebAssembly приложения
прошивки для микроконтроллеров ESP32, RPi Pico, STM32, NRF52
библиотеки и консольные утилиты
и много всего ещё.
Если с приложениями для Apple всё понятно – скачал Xcode и вперёд, то к остальным направлениям довольно непросто подступиться даже тем, кто на macOS и давно-давно пишет на Swift. Каждое стороннее направление нужно как отыскать, так и настроить под него окружение и изучить первые шаги, чтобы создать начальный проект.
Порог входа в Swift, на мой взгляд, довольно высок, особенно за пределами macOS.
Обзор Swift Stream IDE
Итак, как я говорил выше, расширение Swift Stream IDE для VSCode родилось, чтобы упростить жизнь как матёрым программистам живущим в консоли, так и совсем новичкам. В особенности мне очень хочется, чтобы Swift стал интересен и доступен большему количеству людей, от этого экосистема будет развиваться активнее, и использоваться язык будет больше. А значит, в мире будет больше красоты, ведь Swift очень красив и лаконичен. И, конечно, работы на этом языке будет больше для всех.
Установка
Откройте в левом баре вкладку с расширениями и начните набирать Swift Stream
.
В числе первых результатов выберите то, что показано на скриншоте ниже.

Или перейдите по ссылке на сайт маркетплейса и установите оттуда.
В любом случае вы попадёте на один и тот же экран в VSCode где нужно нажать Install

Кстати, в VSCodium, к сожалению, отсутствует расширение Dev Containers, а соответственно Swift Stream IDE "из коробки" там работать не будет.
Начало использования
Как только расширение установлено в него нужно переключиться. В левом баре вы найдёте знакомую птичку (только летит она вверх), нажмите на неё и выберите действие

Новый проект
При выборе Start New Project
будет предложено ввести имя проекта, путь на локальном диске, и тип проекта (поток, stream).
Stream – это поток. Подразумевается, что Swift Stream IDE поддерживает много потоков. Остается выбрать нужный.

На Windows запускайте окно VSCode в режиме WSL2 и только там создавайте проект. Потому что в файловой системе WSL2 у вас не будет проблем.
Каждый из потоков имеет собственные опции. Мы поговорим о них позже.
Существующий проект
Выбрав Open Existing Project
можно открыть существующий проект, и тогда после его открытия потребуется совершить дополнительную настройку нажав Setup
Открывайте только папку которая содержит
Package.swift

Будет предложено выбрать тип вашего проекта, это важно для правильной настройки окружения в контейнере.

Если проект давний и создавался не в Swift Stream IDE, то может потребоваться дополнительная настройка вручную. Можно создать новый пустой проект в IDE для референса, и перенести из него настройки окружения.
Также, если что, пишите в наши телеграм и дискорд, поможем разобраться.
Требования к системе
Помимо VSCode вам понадобится установленное расширение Dev Containers и сам Docker. При чём я был бы рад сказать, что нужен просто Docker Engine, но тут мы зависим от требований расширения Dev Containers

которое в зависимости от ОС хочет разное. На маке только Docker Desktop, на Windows то же Docker Desktop или можно выбрать Execute in WSL, на Linux ориентируйтесь по диалогу при создании проекта.

На маке, например, даже при заранее установленном Docker Desktop вы можете увидеть сообщение о необходимости доустановить Docker Engine. Просто жмите Install
, ничего не поделать, пути Microsoft неисповедимы..
После нажатия кнопки Create Project начнётся загрузка докер-образа из которого будет создан контейнер, это может занять некоторое время в зависимости от вашего соединения, размер образа 350Мб+ в зависимости от выбранного направления

Далее окно VSCode перезагрузится в режим работы в контейнере, и автоматически начнётся загрузка необходимых элементов окружения. В первую очередь будет загружен сам Swift, который весит ~1Гб, это займёт некоторое время, наберитесь терпения и радуйтесь тому, что все скачиваемое никак не засорит вашу систему

При создании других проектов на этой же версии Swift уже не нужно будет снова что-либо закачивать, т.к. всё кэшируется на Docker Volumes и переиспользуется.
Соответственно создание второго такого же проекта будет моментальным.

После запуска контейнера также дождитесь установки IDE.
Как всё устроено
В IDE заложено множество шаблонов из которых можно создать проект.
Будем рады вашим идеям новых шаблонов проектов.
Можно, к примеру, добавить шаблон проекта с вашим собственным фреймворком.
Основной докер образ swiftstream/base:noble
базируется на ubuntu:noble
, в него добавлены необходимые зависимости для Swift, а все остальные образы от него наследуются. Этот образ создан для amd64
и arm64
. Ознакомиться с исходниками всех образов можно в репозитории проекта.
В каждый дочерний образ зашиваются только необходимые системные зависимости, которые должны оставаться неизменными.
В образе есть переменная окружения S_IMAGE_VERSION=100
которую считывает IDE, нужна она для последующих обновлений образа. Если в новом образе ломающее изменение, то число увеличивается и IDE адаптирует логику в зависимости от этого.
Динамические зависимости, например, сам тулчейн Swift или различные SDK устанавливаются в стартовом скрипте контейнера опираясь на выбранную версию заданную в devcontainer.json который изначально генерируется при создании проекта. Сделано это для того, чтобы можно было легко обновлять окружение не затрагивая при этом образ.
Все зависимости контейнера (тулчейн, SDK, NDK, и прочее) устанавливаются на Docker Volumes и монтируются в контейнер.
Бенефиты этого подхода очевидны:
контейнер остаётся неизменным
легко следить за установленными зависимостями и легко удалить их хоть все разом, чтобы начать с чистого листа
контейнеры переиспользуют уже установленные зависимости, а значит скачав всё после создания первого проекта, второй и последующие создаются мгновенно
На хост машину ничего не устанавливается, ваша система остаётся чистой
В графическом интерфейсе IDE сделано удобное переключение между версиями Swift в один клик, которое автоматически редактирует devcontainer.json и вам остаётся только одобрить пересборку контейнера. Вы можете редактировать этот файл и вручную. Если новая версия языка уже закеширована на Docker Volumes, то пересборка займет буквально пару секунд.

Рассмотрим devcontainer.json детально
Основным ключом в нём является S_MODE
который может принимать следующие значения: ANDROID
, SERVER
, WEB
, EMBEDDED
, PURE
.
По нему настраивается вся логика IDE.
Для EMBEDDED
, к примеру, имеется дополнительный ключ S_EMBEDDED_BRANCH
, который может быть: RASPBERRY
, ESP32
, STM32
, NRF
.
По нему происходит дополнительное переключение интерфейса и логики под конкретного вендора микроконтроллеров.
В ключах S_VERSION_[MAJOR | MINOR | PATCH]
указывается версия Swift от которой зависит очень много заложенной логики для правильной сборки проектов.
Остальные разновидности ключей перечислять очень долго, это уже будет походить на документацию. Вы сможете ознакомиться с ними в вашем конкретном devcontainer.json, их назначение вам будет понятно.
В объекте customizations
происходит тонкая настройка VSCode, начиная с установки необходимых расширений заканчивая параметрами Swift для корректной работы подсветки и автокомплита.
Параметры capAdd
и securityOpt
обязательны для работы отладчика.
Также вам будет интересен объект mounts
в котором перечислены все примонтированные к контейнеру Docker Volumes. Вы увидите стандартные разделы swift-toolchains
и swift-sdks
которые трогать не стоит, т.к. это сломает логику IDE. И ещё вы найдёте, что папка .build
для проекта тоже примонтирована в Docker Volumes – это критически необходимо для быстрой сборки проекта, в противном случае производительность катастрофически падает если ваша хост система отлична от Linux.
Вы можете легко примонтировать что-либо из вашей хост системы либо отредактировав этот файл вручную, либо воспользовавшись удобным UI в IDE.
К примеру, для разработки вам может понадобиться временно примонтировать локальные исходники той или иной библиотеки – сделайте это в два клика

Разновидности проектов
Каждое направление (stream) имеет свой проработанный UI, дополнительные сервисы и плагины (features).
Сервер
Создать проект серверного приложения предлагается на фреймворках Vapor и Hummingbird

Базовый серверный интерфейс предлагает возможность выбора таргета, сборки, запуска, тестирования, включения горячей пересборки, и выбора режима сборки (о нём ниже).

Выбор режима сборки определяет формат конечного исполняемого файла.
Standard - сборка выполняется с использованием glibc, итоговый бинарный файл зависит от системных библиотек установленных на целевой машине.
Static Linux - сборка выполняется с использованием musl, исполняемый файл включает в себя все необходимые зависимости и может запускаться практически на любой Linux-системе, даже без установленных библиотек.

Плагины (features) для сервера добавляют удобства при разработке или деплое кода. К примеру, вы можете установить Nginx в контейнер в один клик, чтобы отладить свой сервер в реальном работе с Nginx. Также вы можете установить Ngrok, чтобы потестировать свой сервер через интернет. Или можете тоже в пару кликов задеплоить свой проект на fly.io. В планах добавить такие хостинги как heroku, azure, DO, vercel, alibaba и, возможно, yandex. Пишите в комментариях какой хостинг хотелось бы видеть вам.
В данный момент на полпути фича с SFTP для быстрой выгрузки бинарника на сервер.

После добавления плагина будет предложено пересобрать контейнер, жмите Rebuild

При пересборке поверх оригинального серверного образа устанавливаются слои с плагинами, получается композитный контейнер со всем необходимым

После установки плагинов в боковое меню добавляются соответствующие пункты.
Nginx позволяет перезапустить сервис, отображает и позволяет изменить порт, а кнопка Configuration открывает в редакторе файл конфигурации.
В Ngrok кнопка Start запускает сервис в консоли, а Configuration так же открывает файл конфигурации в редакторе.
У Fly.io сначала нужно нажать Setup, это создаёт одноимённую папку в корне проекта, которая содержит Dockerfile
и конфигурационные файлы для последующего деплоя.
Удалить плагин так же легко как и установить, просто нажатием Deintegrate.
Веб
Swift компилируется в WebAssembly, а это открывает возможности создания веб-приложений. В IDE на выбор предлагаются два шаблона PWA и SPA приложения работающих на фреймворке SwifWeb

PWA приложение будет иметь дополнительный Service Worker таргет, а SPA нет.

Интерфейс IDE для разработки веб-приложений имеет больше специфических элементов.
Build собирает проект в папку DevPublic
которая хостится локально через правильно настроенный nginx на 77xx
порту.
Debug in Chrome запускает отладку в отдельном инстансе Google Chrome.
Run Crawl Server стартует инстанс сервера для поисковых систем, чтобы вы убедились в том как для них рендерятся страницы.
Также у нас появились флаги включения gzip и brotli компрессии, и автоматической перезагрузки страницы в режиме разработки.
Релизный раздел здесь имеет только кнопку сборки которая компилирует и складывает готовые к деплою файлы в папку DistPublic
.
Раздел обслуживания позволяет отдельно перекомпилировать JS, CSS, HTML, или скопировать ресурсы в папку DevPublic
.
И нам видны порты для дебаг, релиз и сервера поисковых систем, которые так же можно изменить.

Раздел с плагинами (фичами) то же отличается. Здесь, на сегодняшний день, нам доступны два плагина для деплоя: на Firebase и на Fly.io.
Их установка так же производится в один клик с необходимостью пересборки контейнера.

Firebase и Fly.io плагины очень просты в использовании, всего буквально две кнопки.
Configuration проведёт вас через в консоль где запустит команды в официальном CLI.
Deploy отправит ваш проект прямо на хостинг в один клик.
О том как писать веб-приложения есть устаревшая публикация на английском, в ней можно понять как всё выглядит, а новую публикацию скоро напишу тут.
Embedded
IDE поддерживает несколько платформ: ESP32, STM32, NRF52 и Raspberry Pi Pico

При выборе платформы предлагается выбрать шаблон проекта, например простое моргание светодиодом или управление LED лентой. Для STM32 также доступны шаблоны с выводом лого на экран и UART-эхо.
Под каждую платформу окружение разработки создано индивидуально.

Так, например, выглядит интерфейс IDE для ESP32.
Здесь вы можете собрать файл прошивки и прошить его.
Отдельно стоит заметить возможность отладки в заранее сконфигурированном Wokwi симуляторе.
Интерфейс для других платформ и детали использования будут описаны в отдельной публикации.
Android
Да, это не шутка. На Swift можно писать под Android. Достигается это через JNI.
В IDE есть два режима: Application и Library.

Про создание android-библиотеки написано в этой публикации.
О создании полноценного приложения в скором времени будет серия публикаций.
Package (pure)
Я называю этот режим "чистым", потому что это про создание пакетов просто свифтом, ничего лишнего, а значит интерфейс тоже оригинальный, чистый.
Как говорится pure experience.

Этот список шаблонов повторяет функционал команды swift package init
, и на самом деле её и вызывает под капотом.
Техобслуживание проекта
Когда необходимо очистить кэш проекта, перезапустить LSP (сервис подсветки кода), скачать или обновить зависимости, можно сделать это в консоли или в удобном меню IDE

Ошибки компиляции и предупреждения
Если вы хоть раз вызывали команду swift build
в консоли, то могли видеть, что компилятор печатает вам один и тот же warning
или error
столько раз, сколько у вас потоков у CPU. В случае с процессором М1 это может быть 10. Не самое приятное зрелище, буквально начинает рябить в глазах... IDE решает эту проблему красивым выводом кликабельных предупреждений и ошибок компиляции


Логи
Сборка проекта и другие команды IDE сопровождаются выводом логов в окне Output.
Детализация вывода имеет градации от Normal, Detailed, Verbose до Unbearable.
Detailed установлен по умолчанию, а Unbearable самый невыносимый с максимальным количеством деталей о каждом этапе.
Переключение уровня детализации происходит либо в UI либо в .vscode/settings.json

Также доступна опция очистки окна Output перед каждой сборкой.
По умолчанию выключено.

Иногда нужно пересобрать контейнер, сделать это можно специальной командой в VSCode или удобными кнопками в UI. Отдельно стоит уделить внимание пересборке без кэша, это может понадобиться в редком случае если нужно будет обновить докер-образ.

Терминал хост машины
Вам может понадобиться доступ к консоли хост машины не выходя из IDE, для этого есть отдельная кнопка в UI

Проброс SSH ключей
При разработке вам могут понадобиться ключи к вашим приватным репозиториям. Не копируйте и не монтируйте их в контейнер. Лучше всего использовать SSH Agent.
В IDЕ для этого есть удобные кнопки и даже инструкции, но подробнее об этом можно почитать здесь.

Поддержка
Завершим обзор IDЕ разделом Support, который меняется в зависимости от типа проекта и ведёт в документацию и репозиторий того или иного фреймворка.

Хочется сказать, что удобства, они... в мелочах. Немного тут, немного там, и вот уже не хочется возвращаться к ручной волоките, а хочется продуктивно сконцентрироваться на самом главном – разработке продукта.
Надеюсь, что было интересно и появилось желание попробовать эту IDE в деле.
Установить её можно в оригинальный VSCode из маркетплейса.
Это проект с открытым исходным кодом и распространяется под лицензией MIT.
Ознакомиться с исходниками и поставить звезду можно в репозитории swiftstream/ide.
Поддержать проект можно поделившись ссылкой на эту публикацию с друзьями и коллегами.
Будем очень рады вам в нашем Discord и Телеграм.
Михаил Исаев
Автор Swift Stream IDE