- PVSM.RU - https://www.pvsm.ru -
Конфигурация проекта в Xcode выглядит, как пульт управления космическим кораблем. Зачастую люди понимают, как работает система сборки, но путают [1] термины. В этой статье мы пройдемся по структуре проекта, таргетам, настройкам конфигураций и воркспейсам. Поехали!
Не сказать, что тема свежая — Apple освещала её ещё в 2011 году на wwdc [2]. И ещё раз в этом году [3].
Поэтому, чтобы добавить статье свежести, используем в качестве аналогии какую-нибудь модную технологию. Например, представим, что Xcode — 3d-принтер, способный печатать еду. И мы решили использовать его в качестве кухни для точки общественного питания.
Разберемся по порядку, ниже речь пойдет о:
К примеру, мы хотим кормить людей пиццей и поэтому создаем для нашего 3d-принтера специальный модуль, Pizza.project, который содержит информацию о том, как готовить абстрактную пиццу (форма, время приготовления, возможные ингредиенты и т.д.).
Документация:
Project — это репозиторий для файлов и ресурсов, необходимых для сборки программного продукта. Проект содержит все элементы, используемые для сборки ваших продуктов и поддерживает связи между этими элементами. Проект определяет настройки по умолчанию для всех таргетов в проекте.
Поскольку абстрактную пиццу у нас никто не купит, нам нужно дополнительно загрузить в наш 3d-принтер несколько моделей конкретных пицц, которые, на основе нашего Pizza.project будет описывать 3d-принтеру, как печатать конкретную пиццу (какие из имеющихся ингредиентов использовать, какую температуру держать при готовке, какой должен быть размер). Такой моделью будет таргет.
Документация:
Таргет точно определяет, какой продукт будет собран, и содержит инструкции для сборки проекта из набора файлов воркспейса или проекта.
Как можно догадаться из названия, таргет описывает цель, к которой мы движемся в своей работе. Это может быть приложение под одну из четырех осей, библиотека или фреймворк, экстеншн или виджет, набор тестов. В Swift каждый Xcode-таргет представляется как отдельный модуль [5], который можно импортировать и обращаться к нему через его публичный API. Самое важное: мы можем иметь сразу несколько таргетов на одной кодовой базе, которые могут использовать одни и те же исходники и ресурсы. В зависимости от типа конечного продукта и операционной системы, на которой он будет работать, таргет может нести разный набор ответственностей.
Также мы можем добавить к таргету зависимости, помогая Xcode определить порядок сборки продуктов. Возвращаясь к нашему примеру с пиццей, мы можем предложить нашим клиентам комбо из двух пицц, добавив таргет PizzaCombo.
Как видно на скриншоте, для этого нам пришлось создать таргеты для Гавайской пиццы и Маргариты в виде фреймворков. Теперь нам осталось лишь добавить их в виде зависимостей к таргету PizzaCombo, и мы сможем пользоваться этими продуктами внутри другого продукта.
Помимо правильных ингредиентов для приготовления правильной пиццы наш 3d-принтер должен соблюсти ряд правил. Некоторые из них специфичны для проекта пиццы вообще (например, все пиццы должны печататься одной формы), некоторые специфичны для конкретной пиццы (например, Гавайская пицца должна готовиться при иной температуре, нежели Маргарита, иначе ананасы будут сухими).
Документация:
Настройка сборки — это переменная, которая содержит информацию о том, как должен быть выполнен какой-то конкретный аспект процесса сборки.
Когда я впервые заглянул в раздел Build Settings, моей первой ассоциацией было:
Однако к счастью, нам не обязательно в повседневной разработке знать все имеющиеся настройки и их ключи, а постоянно мы используем лишь некоторые.
Каждая настройка состоит из ключа, значения и заголовка для ключа в человекочитаемом формате (чтобы можно было уместить во вкладке Build Settings).
Значение для настройки может быть установлено как на уровне проекта, так и на уровне таргета. Если на каком-то из уровней значение для настройки не было установлено, она наследует значение с предыдущего уровня.
Наследование осуществляется в следующем порядке (от меньшего к большему):
Понять, на каком уровне установлено значение для той или иной настройки в Xcode можно с помощью кнопки Levels в разделе Build Settings. Зеленым цветом будет отмечено значение, которое будет установлено при сборке.
Важно знать, что мы можем добавлять свои User-Defined настройки и использовать их, например, в фазах сборки или в Info.plist-файле (хотя и с некоторыми ограничениями).
Также стоит упомянуть о возможности выставления условных настроек. То есть иметь разные значения для одной и той же настройки в зависимости от платформы, для которой продукт будет собран. Для более «умного» и гибкого разделения настроек нам следует воспользоваться конфигурациями сборки.
К примеру мы решили, что каждая пицца будет представлена в обычном и диетическом варианте. Диетический вариант пиццы будет не таким поджаренными, жареная ветчина будет заменена на вареную, тесто будет без соли. Тогда два варианта одной и той же пиццы будут различаться целым набором настроек нашего принтера. Чтобы не создавать новые таргеты для каждой из уже имеющихся пицц, а применять лишь различные наборы настроек для печатания, мы используем конфигурации сборки.
Документация:
Конфигурация сборки определяет набор настроек сборки, используемых для сборки продукта таргета определенным образом.
По умолчанию Xcode создает нам две конфигурации Debug и Release, однако мы можем добавить столько конфигураций, сколько нам потребуется.
Таким образом, создав конфигурации для обычной и диетической пиццы, мы можем выставить для каждой отличающейся настройки два значения, соответствующих каждой из конфигураций, а при сборке просто устанавливать нужную в данный момент конфигурацию.
Так можно, например [6], разделять сборки приложения для работы с тестовым и продуктивным серверами.
Мы можем вынести конфигурации сборки в xcconfig-файлы, чтобы снять одну из ответственностей .pbxproj-файла и облегчить мёрдж при одновременном изменении настроек. Это можно сделать, например, с помощью этого инструмента [7].
Вот мы начали печатать свою пиццу, добавили пару вариантов пицц, собрали обратную связь с наших клиентов и оказалось, что большинству из них нравится наша пицца, однако они бы хотели есть её вместе с роллами. На основе Pizza.project сделать ролл у нас не получится, поэтому мы добавляем в наш 3d-принтер проект Sushi.project, создаем на его основе пару моделей (таргетов) для конкретных роллов. Теперь мы можем печатать и пиццу, и роллы, однако раз наши клиенты хотят есть их вместе, сделаем им такое предложение. Мы создаем Pizza.workspace, в который включаем проект с суши. Теперь мы можем сформировать таргеты для комбинированных бизнес-ланчей, в которые будут включены как конкретная пицца, так и конкретный ролл. Также в этот проект мы можем включить стороннюю библиотеку по печати кальянов, которую будем использовать и при печати пиццы, и при печати роллов, и при печати комбинированных бизнес-ланчей. Например, пусть первый вариант бизнес-ланча будет включать в себя гавайскую пиццу, роллы «Филадельфия» и кальян из сторонней библиотеки:
Документация:
Workspace — Xcode-документ, группирующий проекты и другие документы для работы с ними как с единым целым.
Проще говоря, воркспейс позволяет нам объединить любое количество проектов и относящихся к ним файлов в едином контейнере. Что это нам даёт?
Также мы можем увидеть уже знакомые нам папки .xcuserdata и .xcshareddata. Мы можем сами решать, куда, например, сохранить схему: на уровень проекта или на уровень воркспейса. В зависимости от нашего выбора она появится либо в одной из папок в .xcodeproj, либо в одной из папок в .xcworkspace.
Сегодня мы узнали, что проект — это репозиторий для файлов проекта, таргетов, конфигураций и базовых настроек. Что таргет — это набор инструкций для сборки продукта на основе проекта, которому этот таргет принадлежит. Что настройки сборки — это пары «ключ-значение», которые описывают какой-то аспект сборки и могут выставляться как на уровне проекта, так и на уровне таргета. Что конфигурация сборки — набор значений для каждой настройки сборки, объединенных какой-то общей идеей. И наконец, что воркспейс — контейнер для удобного совместного использования нескольких проектов. Надеюсь, прочитав эту статью, вы не будете путаться в терминологии и вспоминать кто же отвечает за фазы сборки: воркспейс или таргет?
Автор: REDMADROBOT
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/mobile-development/203464
Ссылки в тексте:
[1] путают: http://www.jontolof.com/cocoa/using-xcconfig-files-for-you-xcode-project/
[2] wwdc: https://developer.apple.com/videos/play/wwdc2011/313/
[3] году: https://developer.apple.com/videos/play/wwdc2016/413/
[4] статьи: http://neurocline.github.io/dev/2016/04/16/xcode-xcworkspace-and-xcodeproj.html
[5] модуль: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html#//apple_ref/doc/uid/TP40014097-CH41-ID4
[6] например: http://blog.stablekernel.com/ios-build-configurations-and-schemes/)
[7] инструмента: https://github.com/dempseyatgithub/BuildSettingExtractor
[8] Источник: https://habrahabr.ru/post/313706/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.