Установка Swift на Windows. Изолента, клей, cmd

Kate

Administrator
Команда форума
Сегодня я поделюсь своим опытом страданий установки языка программирования Swift под Windows в форме небольшого рассказа и постараюсь описать те проблемы, с которыми я столкнулся при попытке развернуть детище Apple на платформе конкурента.

Начну издалека. Я являюсь мобильным разработчиком под Андроид и периодически люблю развлекать себя различными экспериментами. Совсем недавно ко мне в руки попал Mac Mini на Apple Silicon - в офисе был бесхозный компьютер от яблочной корпорации и в один момент я захотел собрать свой пет-проект на KMP (бывш. КММ) под айос, посмотреть, как оно будет работать. (И будет ли работать вообще) Плюсом меня давно тянуло к макоси, было интересно за что ее кто-то обожает, а кто-то терпеть не может. Забавно, что нейтрального мнения я не встречал ни разу.

Установка Swift​

В первую очередь, я решил зайти на официальный сайт Swift и посмотреть, поддерживает ли он ОС от Майкрософт. К моему счастью, добрые дяди (или тети) программисты уже попотели за меня и добавили поддержку ЯПа в винду, начиная с 10ки.

Официальный сайт Swift с инструкциями к установке для разных ОС.

Официальный сайт Swift с инструкциями к установке для разных ОС.
Переходим в инструкции для нужной нам ОС и видим это:

Инструкция по установке Swift на Windows

Инструкция по установке Swift на Windows
Нас просят изначально поставить некоторый список зависимостей. Ставим сначала Visual Studio (в моем случае 2022). При установке выбираем «Разработка классических приложений на С++». Как только поставилось, листаем чуть ниже.

0f3e8693ea103c8a5e42427c0fedad36.png

И вот тут лично у меня было некоторое смятение. К чему относиться блок ниже? К scoop? winget? Почему он так оформлен, будто является частью большого заголовка? Может, я придираюсь, но, честно говоря, это совсем неочевидно.

Хорошо. Будем действовать одним из самых древних методов познания – методом тыка.

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

winget install Git.Git

winget install Python.Python.3 --version 3.10.2150.0

winget install Python.Python.3.9

winget install Microsoft.VisualStudio.2022.Community --force --custom "--add Microsoft.VisualStudio.Component.Windows10SDK.19041 --add Microsoft.VisualStudio.Component.VC.Tools.x86.x64"
В чем разница? Сразу же можно заметить, что мы устанавливаем кроме Python 3.10 еще и Python 3.9. Это потребуется нам, когда мы будем собирать наш проект. Так же я просто поменял версию студии, так как скрипт написан для 2019, а у меня 2022.

Будем считать, что первый шаг сделан. Листаем инструкцию дальше.

b2d4f0944f97a7e76135d79897f61606.png

Видим, что теперь нас просят установить сам свифт, я предпочитаю скачать exe-шник, поэтому поставлю его.

На этом казалось бы все. Свифт стоит у вас на компьютере и можно даже что нибудь написать и запустить. Ведь можно же, да? Нет. На самом деле компилятор и все тулзы у вас действительно установлены, но вот нет никакой инфраструктуры, чтобы можно было хоть что то написать и запустить. Сейчас кто-то может возразить, мол, есть же Swift REPL, интерактивный редактор кода, который идет в комплекте со свифтом, в нем же тоже можно писать код. Безусловно можно, но лично у меня возникла такая проблема:

16ed71bb3ea98040d7d5768d17e6da2a.png

Это вынудило меня искать обходной путь.

Установка инструментов разработки​

Буквально сразу в мою голову закралась мысль: «А что, если мы будем использовать VS Code?». Иногда мне кажется, что в этом простеньком редакторе можно или вскоре будет можно даже программировать ядерные реакторы, достаточно будет лишь доставить необходимые плагины для работы. Конкретно сейчас мы ядерные реакторы не программируем, но гибкость VS Code нам так же очень пригодится.

Ставим сначала редактор, после того как поставили ставим плагин для свифта. В нем есть: подсветка кода, дебаггинг, автодополнение, запуск .swift файлов (об этой функции мы поговорим чуть позже) и много чего еще, полный список можно найти в карточке плагина.

После того как поставили, пробуем наконец таки запустить наш простенький код на свифте:

print(“Hello world!!!”)
Жмем Ctrl + Shift + P и выбираем "Swift: Run swift script". И тут лично меня ждало еще одно разочарование:

dae9966f3f0cfa3e0060dd26bd6d7daf.png

Пораскинув мозгами, я пришел к единственно верному решению – отобрать у VS Code его работу и собирать и компилировать скрипты самостоятельно, вводя команды в cmd. Не самый приятный исход, но вполне себе терпимый.

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

swift package init
Далее переходим в папку Sources/<PROJECT NAME> и создаем там файл с именем main и расширением .swift (Обязательно файл должен иметь имя main, так как пакету нужна входная точка для исполнения кода). Итого файл должен называться так: main.swift.

После всего этого открываем наш main.swift в VS Code и пробуем запустить все тот же код.

Кажется, что это все и теперь мы можем спокойно выполнить наш код, но не тут-то было:

a9e9a40021ac57e8d9d88d2fdb1e7902.png

Оказывается, у нас беды с конфигурацией пакета, поэтому, в первую очередь, необходимо устранить эту проблему. Поднимаемся наверх по директориям, пока не дойдем до корневой папки пакета, где лежит файл Package.swift. Открываем его.

Меняем

let package = Package(

name: <PROJECT NAME>,

products: [

// Products define the executables and libraries a package produces, making them visible to other packages.

.library(

name: <PROJECT NAME>,

targets: [<PROJECT NAME>,])

],

targets: [

// Targets are the basic building blocks of a package, defining a module or a test suite.

// Targets can depend on other targets in this package and products from dependencies.

.target(

name: <PROJECT NAME>,),

.testTarget(

name: <PROJECT NAME TESTS>,

dependencies: ["<PROJECT NAME>,"])

]

)
На

let package = Package(

name: <PROJECT NAME>,

products: [

// Products define the executables and libraries a package produces, making them visible to other packages.

.executable(

name: "main",

targets: ["<PROJECT NAME>"])

],

targets: [

// Targets are the basic building blocks of a package, defining a module or a test suite.

// Targets can depend on other targets in this package and products from dependencies.

.target(

name: <PROJECT NAME>,

dependencies: []),

.testTarget(

name: <PROJECT NAME TESTS>,

dependencies: [<PROJECT NAME>])

]

)
Сохраняем изменения. Находясь в директории, где лежит файл main.swift запускаем команду:

swift run
Вуаля, код заработал, можно открывать шампанское.

c97bc9c91c2a67eb069fbdf2b56af833.png

Стоит отметить, что, возможно вы столкнетесь с такой проблемой, когда компилятор просто соберет готовый исполняемый файл, но не запустит его. Чтобы это решить перейдите сначала в корневую директорию проекта (папка .build/x86_64-unknown-windows-msvc\debug), там найдите файл main.exe и запустите его. Если он будет сразу же закрываться после запуска, то добавьте в конце всего кода функцию readLine() и тогда консоль не будет закрываться сразу же, а будет ждать ввод любой клавиши.

Когда я устанавливал все это дело в первый раз, я столкнулся с проблемой, которую не мог решить, после нескольких дней своих изысканий было решено забить на установку свифта прямо на винду и сделать все через WSL. Я проследовал всем инструкциям, что были указаны на сайте для установки свифт под Линукс, но опять забрел в тупик и решил бросить это дело в принципе. Но в тот же день я заметил, что ни один из установленных компиляторв C++ не может собрать простейший проект. Каждый как под копирку твердил, что не может найти необходимые файлы при линковке, естественно я начал свое расследование, что же послужило причиной выхода из строя линковщика. Искал я очень упорно, но результатов все не было, я удалил свифт с винды, переустановил начисто Visual Studio 3 раза, но ничего не помогало. И, наконец, на третий день я вспомнил про wsl и снес все пакеты, что я поставил во время той злосчастной установки. Каково же было мое счастье, что после всех попыток разобраться, я в кой то веке нашел ответ. Как уже стало ясно из рассказа, установка свифта из под wsl ломает линковщик компиляторов С++ (в частности, MSVC и GCC). Поэтому, никогда ни за что, ни при каких обстоятельствах, не совершайте этой ошибки. Она может стоить слишком дорого.

После этого, на удивление, я снова захотел поставить свифт, только теперь более основательно подойти к процессу. Результатом этого желания стала данная статья.

Заключение​

Напоследок, хочу сказать, что это был крайне незабываемый опыт. Можно отметить, что документация в некоторых местах оставляет желать лучшего и хотелось бы более понятной инструкции к установке, так же, конечно, сказывается отсутствие нормального инструментария.

 
Сверху