Как я могу условно включить файл, основанный на конфигурации сборки в XCode? - PullRequest
72 голосов
/ 14 декабря 2011

У меня есть проект Xcode с большим количеством целей, в который я хотел бы включить комплект настроек для приложений, созданных в конфигурациях Ad-hoc и Debug, но не в конфигурации Release.

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

Это оставляет написание пользовательского правила сборки.Мой план состоит в том, чтобы исключить файл Settings.bundle из всех целей и создать правило сборки, которое условно копирует его в пакет продукта, но найти подходящие примеры действительно сложно.

Правило сборки, которое я запустил, имеет параметр Process, установленный на «Исходные файлы с совпадающими именами» и Settings.bundle в качестве имени.Параметр использования «Пользовательский сценарий:».

Мой пользовательский сценарий выглядит следующим образом (с учетом того, что мой сценарий bash находится на уровне культа груза):

if [${CONFIGURATION} = 'Debug'] then
    cp -r ${INPUT_FILE_PATH} ${DERIVED_FILES_DIR}/.
fi

Наконец, в качестве выходного файла указан ${DERIVED_FILES_DIR}/Settings.bundle.

Поскольку я здесь, должно быть очевидно, что это не работает.Мой первый вопрос: есть ли где-нибудь, где я могу просмотреть выходные данные правил сборки как execute, чтобы убедиться, что 1) он действительно выполняется и 2) у меня где-то нет глупой синтаксической ошибки.

Кроме того, в каком месте (в форме переменной среды) скопировать вывод?

Ответы [ 6 ]

76 голосов
/ 10 февраля 2012

Я наконец понял это.

Для каждой цели, для которой вы хотите условно включить пакет настроек, выберите его Проект из списка источников, выберите цель и перейдите на вкладку «Фазы сборки».

Нажмите кнопку «Добавить этап сборки» и выберите «Добавить сценарий запуска».

Затем введите следующее для сценария:

if [ "${CONFIGURATION}" == "Debug" ]; then
    cp -r "${PROJECT_DIR}/Settings.bundle" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app"
fi
44 голосов
/ 10 октября 2013

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

Мне требовалось иметь разные наборы настроек дляразличные конфигурации сборки, а не просто не включать его в релиз.Предполагая упрощенный подход только из конфигураций Debug и Release , вот как это сделать:

Начните с добавления двух пакетов настроек в проект с именем Settings-debug.bundle иSettings-release.bundle и затем удалите эти файлы из фазы сборки Copy Bundle Resources .Затем добавьте пользовательский параметр сборки с именем SETTINGS_BUNDLE, который имеет разные значения для каждой конфигурации:

Debug        ${PROJECT_DIR}/relative/path/to/Settings-debug.bundle
Release      ${PROJECT_DIR}/relative/path/to/Settings-release.bundle

Затем добавьте этап сборки сценария выполнения (после Copy Bundle Resources ) с именем Копирование комплекта настроек с измененной версией скрипта в решении Фрэнка.

cp -r "${SETTINGS_BUNDLE}/" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle"

Разница в том, что скопированный комплект всегда называется Settings.bundle независимо от того,имени источника.

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

touch "${PROJECT_DIR}/relative/path/to/main.m"
21 голосов
/ 07 апреля 2016

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

Перейдите в настройки сборки вашей цели> Нажмите кнопку +> Добавить пользовательскую настройку

Ключ может быть INCLUDED_SOURCE_FILE_NAMES или EXCLUDED_SOURCE_FILE_NAMES

Значение представляет собой список путей к файлам через пробел

См. Ссылку: http://lists.apple.com/archives/xcode-users/2009/Jun/msg00153.html

7 голосов
/ 30 июля 2014

Settings.bundle всегда копируется в область назначения независимо от того, была ли выбрана конфигурация Release или Debug. Итак, может быть, вам нужен следующий код:

if [ ${CONFIGURATION} == "Release" ]; then
    rm -rf ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle
fi
3 голосов
/ 14 декабря 2011

Я не эксперт по сценариям оболочки, но думаю, вам нужно пространство между квадратными скобками и условием. Также может помочь цитирование переменных:

if [ "${CONFIGURATION}" = "Debug" ] then
    cp -r "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}"/.
fi

Что касается местоположения, я использую "$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME" для корня моего пакета приложений OS X.

2 голосов
/ 24 апреля 2018

(протестировано с Xcode 9.3 )

Я не могу найти, когда Xcode включил эту функцию, но EXCLUDED_SOURCE_FILE_NAMES теперь напрямую доступен в Build Settings > Build Options > Excluded Source File Names.

Так что вам больше не нужно создавать User-Defined Setting.

см. Ниже: enter image description here

Он автоматически добавит эту строку в ваш .pbxproj. enter image description here

...