Skip to main content

Конфигурации сборки проекта

О конфигурациях#

Обычно практики разработки предписывают строгое разделение конфигураций от кода. Тем не менее, большинство iOS-разработчиков пытаются совместить эти рекомендации с рабочим процессом сборки Xcode.

build-settigs

Перейдя во вкладку Build Settigs, вы увидите сотни настроек сборки, распределенных по слоям проекта, целям и конфигурациям, и это не говоря об остальных вкладках.

Как это устроено#

В этой многоуроневой таблице вы можете увидеть столбцы - это слои проекта. Они расположены в приоритетном порядке справа налево.

build-settings-levels

Включить такое отображение таблицы вы можете нажав на кнопку Levels.

build-configuration-levels-button

Чтобы указать для какой-то конфигурации файл, который ее настраивает, достаточно просто в PROJECT_NAME.xcodeproj -> Project -> PROJECT_NAME -> Configurations указать файл с расширением xcconfig.

build-configurations-started

build-configurations-select

Перейдем к заполнению config-файла:

SDKROOT = iphoneos

Узнать название настройки вы можете прямо в Xcode'е в разделе Quick Help бокового меню, ну или по этой ссылке.

build-configurations-help

Чтобы понять, что какую-то настройку мы получили именно из файла конфигурации, а не из файла проекта, необходимо просто посмотреть на уровни таблицы - конечная настройка выделяется другим цветом:

build-configuration-file-or-project

Теперь достаточно удалить это поле в файле конфигурации проекта нажатием Backspace ⌫.

build-seetings-deleted

Как мы видим конечным параметром стал именно наш параметр из файла.

important

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

Как делаем мы#

На наших проектах мы используем 6 типов конфигураций сборки, их вы можете найти в настройках проекта:

build-configuration

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

Все они находятся в директории BuildConfigurations/Cofigurations.

configuration-combine

Например, если рассмотрим конфигурацию dev-debug, то можно заметить, что она базируется на файле конфигурации ios-app.dev-debug.xcconfig.

Посмотрим что в нем:

#include "../ios-app.dev.xcconfig"#include "../ios-app.debug.xcconfig"

Он комбинирует настройки из файла ios-app.dev.xcconfig и ios-app.debug.xcconfig.

Заглянем в первый из них:

// add "dev" params

Как мы видим настроек для dev-конфигураций пока нет, но их можно добавить в этот файл.

Во втором же файле можно увидеть следующее:

#include "ios-app.shared.xcconfig"
ENABLE_TESTABILITY = YESGCC_PREPROCESSOR_DEFINITIONS = $(inherited) BATTLE_ERROR_DETAIL_OUTPUT=1 SR_ENABLE_LOG=1 DEBUG=1MTL_ENABLE_DEBUG_INFO = YESONLY_ACTIVE_ARCH = YESOTHER_SWIFT_FLAGS = $(inherited) -D DEBUG -Xfrontend -debug-time-function-bodies -Xfrontend -warn-long-function-bodies=500SWIFT_OPTIMIZATION_LEVEL = -OnoneDEBUG_INFORMATION_FORMAT = dwarfENABLE_BITCODE = NO// add "debug" params

Он содержит параметры сборки для всех debug-конфигураций проекта, а так же импортирует параметры из ios-app.shared.xcconfig:

SDKROOT = iphoneosSUPPORTED_PLATFORMS = iphoneos, iphonesimulatorIPHONEOS_DEPLOYMENT_TARGET = 12.0SWIFT_VERSION = 5.0INFOPLIST_FILE = ${SRCROOT}/src/Info.plistPRODUCT_BUNDLE_IDENTIFIER = org.example.appPRODUCT_NAME = mokoAppCLANG_ENABLE_OBJC_WEAK = YESASSETCATALOG_COMPILER_APPICON_NAME = AppIconONLY_ACTIVE_ARCH = YESDEFINES_MODULE = YESCURRENT_PROJECT_VERSION = 1.0GCC_NO_COMMON_BLOCKS = YESENABLE_STRICT_OBJC_MSGSEND = YESCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YESCLANG_WARN_EMPTY_BODY = YESCLANG_WARN_BOOL_CONVERSION = YESCLANG_WARN_CONSTANT_CONVERSION = YESGCC_WARN_64_TO_32_BIT_CONVERSION = YESCLANG_WARN_ENUM_CONVERSION = YESCLANG_WARN_INT_CONVERSION = YESCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YESCLANG_WARN_INFINITE_RECURSION = YESGCC_WARN_ABOUT_RETURN_TYPE = YESCLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YESCLANG_WARN_STRICT_PROTOTYPES = YESCLANG_WARN_COMMA = YESGCC_WARN_UNINITIALIZED_AUTOS = YESCLANG_WARN_UNREACHABLE_CODE = YESGCC_WARN_UNUSED_FUNCTION = YESGCC_WARN_UNUSED_VARIABLE = YESCLANG_WARN_RANGE_LOOP_ANALYSIS = YESCLANG_WARN_SUSPICIOUS_MOVE = YESCLANG_WARN__DUPLICATE_METHOD_MATCH = YESCLANG_WARN_OBJC_LITERAL_CONVERSION = YESCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YESGCC_WARN_UNDECLARED_SELECTOR = YESCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES

Это общие параметры для любой конфигурации проекта.

note

Аналогично устроены и другие конфигурации в проекте. Это сделано для удобства настройки конфигураций и для исключения перезаписывания параметров сборки.

Материалы#