Всем привет сегодня я покажу как можно завернуть проект в spm (модуляризация).
Модуляризация — Это процесс разбиения кодовой базы на небольшие специализированные, готовые к повторному использованию модули.
У меня есть небольшой проект и я хочу чтобы он был завернут в spm.
![](https://habrastorage.org/getpro/habr/upload_files/802/4dd/ad3/8024ddad316c8809038e834560da854b.png)
1) Идем по пути File → New → Package…
![](https://habrastorage.org/getpro/habr/upload_files/b99/d81/dbd/b99d81dbd2e54c632a45067d32a84230.png)
2) Создаем spm указывая его имя в Save as, указываем папку нашего проекта и в Add to: Выбираем наш проект
![](https://habrastorage.org/getpro/habr/upload_files/4a7/b3a/a1a/4a7b3aa1a5279dba655af8a1a4246ac0.png)
Вот что мы увидим
![](https://habrastorage.org/getpro/habr/upload_files/252/28a/4fd/25228a4fda77f4110f2cbbd91665c5a0.png)
Если возникают данные ошибки
![](https://habrastorage.org/getpro/habr/upload_files/5c5/32c/377/5c532c3772b6d89c78115fa4faee19c7.png)
![](https://habrastorage.org/getpro/habr/upload_files/08b/107/7e0/08b1077e0a286c099702117ddbc70b00.png)
То добавляем пару строчек в Package
![](https://habrastorage.org/getpro/habr/upload_files/b84/eec/73c/b84eec73cfa284643917817d4b3ed612.png)
defaultLocalization: "rus",
platforms: [.iOS(.v13)], // чтобы не указывать @available(iOS 13.0, *) в каждом файле можем указать тут
3) Мы переносим все нужные нам файлы (кроме AppDelegate и SceneDelegate) проекта в папку внутри Sources и удаляем сгенерированный файл MyKit (заглушка)
![](https://habrastorage.org/getpro/habr/upload_files/b9b/753/996/b9b7539964f7a148de1f461cc303cb5f.png)
4) Нам нужно сделать 1 файл public для того чтобы можно было с ним взаимодействовать. В данном примере входным экраном в проект является MainTabVC
Делаем класс и viewDidLoad public
![](https://habrastorage.org/getpro/habr/upload_files/c77/2f4/b7f/c772f4b7feea5a30b56aa3c449e3c016.png)
5) Переходим в таргет нашего проекта → General → Frameworks,Libraries, and Embedded Content. И нажимаем + выбираем наш MyKit и нажимаем Add
![](https://habrastorage.org/getpro/habr/upload_files/2bf/cc2/dfb/2bfcc2dfb6c7e02fe0db6ac26ea494e9.png)
![](https://habrastorage.org/getpro/habr/upload_files/3ed/5a2/425/3ed5a2425b3cb73eda5965924ab75812.png)
6) Переходим в тот файл в котором мы будем загружать наш публичный экран, в данном примере мы используем стартовый экран в AppDelegate
Поэтому мы импортируем в него наш SPM
![](https://habrastorage.org/getpro/habr/upload_files/6c7/380/f5d/6c7380f5de2fa3a091407be400d9d455.png)
7) Исправим ошибки с coreData (ее мы тоже перенесли в spm)
И так нам нужно будет убрать currentProductModel оставив поле пустым, затем сверху класса нашей сущности дописать строчку @objc(EntityName)
![](https://habrastorage.org/getpro/habr/upload_files/c61/9a1/ec4/c619a1ec419b3a7263f3796ae8a888c1.png)
![](https://habrastorage.org/getpro/habr/upload_files/1ea/20a/272/1ea20a2726f74f44417ea01fff89601b.png)
8) Нужно указать путь для нашего persistentContainer
let modelURL = Bundle.module.url(forResource: "ProductsData", withExtension: "momd")
Где ProductsData это имя файла coreData а withExtension так и оставляем не меняем
![](https://habrastorage.org/getpro/habr/upload_files/a2a/bb0/1e4/a2abb01e40f05e14427fa183dda8d911.png)
Теперь наша coreData исправно работает и сохраняет данные
9) У нас есть еще одна проблема не отображаются картинки из Assets.
Чтобы решить эту незадачу, мы поступаем так же как и coreData, указываем путь вручную
![В tabBarItems отсутствуют иконки из assets В tabBarItems отсутствуют иконки из assets](https://habrastorage.org/getpro/habr/upload_files/61c/61e/3dd/61c61e3dd1a7c35bca500f0d0b3a536d.png)
// SwiftUI load image from asset catalog
Image("Star", bundle: .module)
// UIKit load image from asset catalog
let image = UIImage(named: "Star", in: .module, compatibleWith: nil)
// Get URL of config.json
let configURL = Bundle.module.url(forResource: "config", withExtension: "json")
10) Исправляем ошибку с другими зависимостями которые мы используем в нашем проекте.
![](https://habrastorage.org/getpro/habr/upload_files/ac9/009/88c/ac900988cfb7d9ae82a7d1ad5c55b4bf.png)
Смотрим, где стоят комментарии //
let package = Package(
name: "MyKit",
defaultLocalization: "rus",
platforms: [.iOS(.v13)],
products: [
.library(
name: "MyKit",
targets: ["MyKit"]),
],
dependencies: [
//Вписываем сылку на гит зависимости и указываем версию
.package(url: "https://github.com/SnapKit/SnapKit.git", .upToNextMinor(from: "5.6.0"))
],
targets: [
.target(
name: "MyKit",
//Незабываем вырбрать в таргете наш проект
dependencies: ["MyKit"]),
.testTarget(
name: "MyKitTests",
dependencies: ["MyKit"]),
]
)
Поздравляю, теперь вы знаете как по-быстрому завернуть проект в spm ????
Комментарии (4)
house2008
21.12.2022 23:07Спасибо!
Я наоборот всё это удалил из проекта, и cocoapods почти все зависимости и spm в пользу Carthage. После этого сборка проекта с ноля стала не 7 минут, а полторы минуты. Индексация проекта Xcode-ом почти мгновенная, потому что больше не надо сорцы зависимостей индексировать. Изменение динамической линковки в пользу статической (для cocoapods есть плагин "cocoapods-pod-linkage") холодный старт с 2.5 секунд упал до 0.5 секунд.
Судя по скриншоту SPM статически линкует зависимости ?
krabdb
Вроде и речь про mac & ios, а скрины из какой-то дремучей до-retina эпохи.
daniilpashin
Весьма вероятно может стоять хакинтош. Да и не все обладатели десктопов обзавелись 4к мониторами, к тому же.
nazar228 Автор
Нет мне прощения ! Опозорил яблоко господ перед ведройдо холопами. Надо было поставить 3x Super Retina XDR 16k, чтобы ведро-рабы плакали смотря на супер разрешение яблочников