Поиск Потерянных Файлов В Нескольких Целях Xcode

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



Поиск потерянных файлов в нескольких целях Xcode

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

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

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

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

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

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

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

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



Поиск потерянных файлов в нескольких целях Xcode

Это очень сложно при работе в большом многоуровневом коллективе, как с точки зрения навыков, так и с точки зрения сплочённости.

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

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

После очередной проблемы с целью Debug мы решили передать контроль над согласованностью целей сценарию.

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

fastlane,generamba и т.п.

).

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

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

    Например, файлы с константами, которые различаются в зависимости от цели (baseUrl, если вы решили организовать проект так, чтобы приложения с разных целей обращались к разным серверам), или файлы GoogleService-Info.plist, которые будут разными для разных целей.

Если скрипт обнаружит разницу, у нас проблема.

Это означает, что тот или иной файл/фреймворк был добавлен в одну цель, но не добавлен в другую.

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

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

Если произойдет ошибка, вы увидите следующее сообщение в Xcode:

Поиск потерянных файлов в нескольких целях Xcode

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

Поиск потерянных файлов в нескольких целях Xcode

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

Полученная утилита прекрасно показывает, что даже будучи iOS-разработчиком, вы можете добавить немного творчества в свою повседневную работу и начать автоматизировать и писать скрипты, которые упростят вам жизнь! Спасибо за внимание! Теги: #разработка iOS #разработка мобильных приложений #с открытым исходным кодом #ruby #разработка мобильных устройств #xcode #surf #surfstudio

Вместе с данным постом часто просматривают: