Как стать автором
Обновить
68.07
Surf
Создаём веб- и мобильные приложения

Находим потерянные файлы в нескольких Xcode таргетах

Время на прочтение 3 мин
Количество просмотров 2.2K

Привет, я Саня — iOS-разработчик в Surf, и в этой статье поделюсь своим способом решения головной боли, которая возникает при работе на проекте с несколькими таргетами.



Предвижу вопрос «зачем тебе, Саня, несколько таргетов в проекте?». Отвечаю: на проекте, где я когда-то работал, был один таргет, привязанный к аккаунту заказчика, так что:


  • доступа к этому аккаунту у нас не было;
  • отсутствовала возможность генерировать provision profiles и distribution сертификаты;
  • самое больное — не было возможности добавлять новые девайсы к provision profiles.

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


Решение было очевидным – создать второй таргет, который будет аналогичен главному, но иметь другой bundle id и который будет целиком и полностью привязан к нашему студийному аккаунту. Сказано – сделано! Второй таргет позволил вести полноценную разработку независимо от разработчиков на стороне заказчика, что не раз спасало нам процесс разработки, к примеру, когда на provision profile главного таргета разработчики заказчика удалили все наши девайсы и мы не могли запускать приложение на своих устройствах.


Несколько таргетов еще могут появиться в вашем проекте, когда нужно, например:


  • собрать несколько приложений из одной кодовой базы, но с разными ресурсами;
  • держать несколько инстансов приложения на одном устройстве.

Но работа на нескольких таргетах ведет к своим минусам, главный — необходимость строго контролировать процесс добавления новых файлов в проект. Они оба идентичны друг другу, соответственно, при добавлении нового файла в проект необходимо ставить галочку напротив обоих таргетов.



Это очень сложно при работе в большой разноуровневой команде, как по скиллам, так и по добросовестности.


Если не придерживаться этого простого правила, после очередного мерджа вы можете обнаружить, что один из таргетов перестал собираться, а Xcode ругается, что не может найти тот или иной класс. Но самое интересное, если кто-то не добавил файл из Copy Bundle Resources в оба таргета (к примеру, xib ячейки), такую ошибку вы сможете обнаружить только лишь в runtime.


После очередной проблемы с Debug-таргетом, решили отдать контроль за консистентностью таргетов на скрипт. В качестве инструмента выбрали язык Ruby, так как для него есть отличный гем xcodeproj , который является чуть ли не стандартом для написания инструментов для iOS разработки (см. fastlane, generamba и т.п.).


В результате разработали скрипт, который реализует следующую логику работы:


  • на вход подаются путь до файла проекта и названия проверяемых таргетов;
  • по пути до проекта скрипт находит сам проект;
  • выбирает нужные таргеты, собирает файлы из них (Compile Sources, Copy Bundle Resources и Frameworks);
  • ищется разница между перечнями файлов;
  • выкидываем из этой разницы файлы из нашего whitelist. К примеру, файлы с константами, которые различаются в зависимости от таргета (baseUrl, если вы решили организовать проект так, чтобы приложения с разных таргетов обращались к разным серверам), либо файлы GoogleService-Info.plist, которые будут разными для разных таргетов.

Если скрипт находит разницу — у нас проблемы. Значит, тот или иной файл/фреймворк были добавлены в один таргет, но не добавлены в другой.


Таким образом, скрипт позволяет:


  • убедиться, что все файлы из Compile Sources и Copy Bundle Resources были корректно добавлены к обоим таргетам;
  • также проверяется идентичность списков добавленных фреймворков, что очень актуально, если на вашем проекте многомодульная архитектура;
  • интеграция скрипта на Build Phase позволит определить проблему еще до непосредственно стадии сборки проекта;
  • а если раньше вы для этого собирали на CI оба таргета, то теперь можно оставить сборку только одного, сократив время сборки на CI вдвое.

В случае ошибки, в Xcode вы сможете наблюдать следующее сообщение:



В случае же успеха — вас ждет единорожек:



Подробная инструкция добавления в проект, настройки, а также Example-project в репозитории.


Получившиеся утилита отлично показывает то, что даже будучи iOS-разработчиком можно внести небольшую дольку креатива в вашу повседневную работу и заняться автоматизацией и написанием скриптов, которые упростят вашу жизнь!


Спасибо за внимание!


Больше полезностей про iOS — в нашем телеграм-канале Surf iOS Team. Публикуем кейсы, лучшие практики, новости и вакансии Surf. Присоединяйтесь >>
Теги:
Хабы:
+4
Комментарии 14
Комментарии Комментарии 14

Публикации

Информация

Сайт
surf.ru
Дата регистрации
Дата основания
Численность
201–500 человек
Местоположение
Россия