Site icon AppTractor

Почему получение пакетов в Swift Package Manager занимает слишком много времени

Давайте перейдем непосредственно к делу, не объясняя историю создания Swift Package Manager или историю падения Римской империи.

Проблема

Когда вы добавляете зависимость в свой проект с помощью Swift Package Manager (spm), он получает весь репозиторий пакета, со всеми ветками и полной историей git, которая может состоять из многолетних снепшотов git.

Зачем?

Вы можете спросить — зачем? Почему бы не получить только релизную ветку или даже готовый релизный коммит?

Ответ кроется в этом комментарии инженера по инфраструктуре в GitHub, который отвечал на проблему в Cocoapods, когда он делал то же самое, что мы хотим, чтобы делал spm — shallow clone:

Как упоминалось в комментарии, неглубокое клонирование (shallow clone) по какой-то причине обходится гораздо дороже, чем клонирование всего репозитория. Поэтому GitHub ограничивает скорость получения таких репозиториев, что может привести к тому, что клонирование пакета займет много времени, даже если его размер относительно меньше размера всего репозитория. Хуже того, выборка может вообще завершиться неудачей из-за таймаута.

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

Решение

Так каково же решение? Судя по всему, многие компании используют такой подход — создание отдельного репозитория, который включает в себя предварительно скомпилированный .xcframework пакета. Потребитель этого пакета теперь получает лишь часть объема оригинального репозитория, содержащего исходный код.

Примеры

Например, команда Airbnb/Lottie использовала этот подход и уменьшила размер своего репо с +300 МБ до менее чем 500 КБ:

Signal также делает то же самое:

Заключение

Если вы нашли эту статью полезной, не стесняйтесь поделиться ею, и если у вас есть отзывы, я буду рад их услышать.

Источник

Exit mobile version