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 = YES
GCC_PREPROCESSOR_DEFINITIONS = $(inherited) BATTLE_ERROR_DETAIL_OUTPUT=1 SR_ENABLE_LOG=1 DEBUG=1
MTL_ENABLE_DEBUG_INFO = YES
ONLY_ACTIVE_ARCH = YES
OTHER_SWIFT_FLAGS = $(inherited) -D DEBUG -Xfrontend -debug-time-function-bodies -Xfrontend -warn-long-function-bodies=500
SWIFT_OPTIMIZATION_LEVEL = -Onone
DEBUG_INFORMATION_FORMAT = dwarf
ENABLE_BITCODE = NO
// add "debug" params

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

SDKROOT = iphoneos
SUPPORTED_PLATFORMS = iphoneos, iphonesimulator
IPHONEOS_DEPLOYMENT_TARGET = 12.0
SWIFT_VERSION = 5.0
INFOPLIST_FILE = ${SRCROOT}/src/Info.plist
PRODUCT_BUNDLE_IDENTIFIER = org.example.app
PRODUCT_NAME = mokoApp
CLANG_ENABLE_OBJC_WEAK = YES
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon
ONLY_ACTIVE_ARCH = YES
DEFINES_MODULE = YES
CURRENT_PROJECT_VERSION = 1.0
GCC_NO_COMMON_BLOCKS = YES
ENABLE_STRICT_OBJC_MSGSEND = YES
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES
CLANG_WARN_EMPTY_BODY = YES
CLANG_WARN_BOOL_CONVERSION = YES
CLANG_WARN_CONSTANT_CONVERSION = YES
GCC_WARN_64_TO_32_BIT_CONVERSION = YES
CLANG_WARN_ENUM_CONVERSION = YES
CLANG_WARN_INT_CONVERSION = YES
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES
CLANG_WARN_INFINITE_RECURSION = YES
GCC_WARN_ABOUT_RETURN_TYPE = YES
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES
CLANG_WARN_STRICT_PROTOTYPES = YES
CLANG_WARN_COMMA = YES
GCC_WARN_UNINITIALIZED_AUTOS = YES
CLANG_WARN_UNREACHABLE_CODE = YES
GCC_WARN_UNUSED_FUNCTION = YES
GCC_WARN_UNUSED_VARIABLE = YES
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES
CLANG_WARN_SUSPICIOUS_MOVE = YES
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES
GCC_WARN_UNDECLARED_SELECTOR = YES
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES

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

note

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

Материалы