Как я могу условно включить файл на основе конфигурации сборки в Xcode?
У меня есть проект Xcode с большим количеством целей, где я хотел бы включить набор настроек для приложений, созданных в конфигурациях Ad-hoc и Debug, но не в конфигурации Release.
Фазы сборки, похоже, не позволяют сделать себя условными для конфигурации (они, очевидно, могут быть условными для цели, но удвоение количества целей в проекте сделает его полностью непригодным).
Это оставляет письменное правило сборки. Мой план состоит в том, чтобы исключить параметр Settings.bundle из всех целей и создать правило сборки, которое условно копирует его в пакет продукта, но подходящие примеры действительно трудно найти.
Правило сборки, которое я запустил, имеет параметр Process, установленный в "Исходные файлы с именами, соответствующими:" и Settings.bundle в качестве имени. Параметр "Использовать" - "Пользовательский script:".
Мой пользовательский script выглядит следующим образом (с оговоркой, что мой скрипт bash находится на уровне культа груза):
if [${CONFIGURATION} = 'Debug'] then
cp -r ${INPUT_FILE_PATH} ${DERIVED_FILES_DIR}/.
fi
Наконец, у меня есть ${DERIVED_FILES_DIR}/Settings.bundle
, указанный в качестве выходного файла.
Поскольку я здесь, должно быть очевидно, что он не работает. Мой первый вопрос заключается в том, есть ли где-то я могу просмотреть вывод правил сборки в качестве выполнения, чтобы убедиться, что 1) он фактически выполняется, и что 2) у меня нет глупой синтаксической ошибки где-то.
Кроме того, какое правильное местоположение (в виде переменной окружения) для копирования вывода на?
Ответы
Ответ 1
Я, наконец, понял это.
Для каждой цели, для которой вы хотите условно включить набор параметров, выберите его Project из списка источников, выберите цель и перейдите на вкладку "Сборка фаз".
Нажмите кнопку "Добавить этап сборки" и выберите "Добавить запуск Script".
Затем введите script:
следующее:
if [ "${CONFIGURATION}" == "Debug" ]; then
cp -r "${PROJECT_DIR}/Settings.bundle" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app"
fi
Ответ 2
Я знаю, что на этот вопрос уже был дан ответ, и ответ был очень полезен для меня, но я тоже хотел бросить свое собственное модифицированное решение.
Мое требование состояло в том, чтобы иметь разные настройки для разных конфигураций компоновки, а не просто не включать их в выпуск. Предполагая упрощенный подход только конфигураций Debug и Release, как это сделать:
Начните с добавления в проект 2 комплектов настроек с именем Settings-debug.bundle
и Settings-release.bundle
, а затем удалите эти файлы с этапа сборки Скопировать Bundle Resources. Затем добавьте настраиваемый пользователем параметр сборки SETTINGS_BUNDLE
, который имеет разные значения для каждой конфигурации:
Debug ${PROJECT_DIR}/relative/path/to/Settings-debug.bundle
Release ${PROJECT_DIR}/relative/path/to/Settings-release.bundle
Затем добавьте фазу сборки run- script (после Ресурсы копирования Bundle Resources) с именем Скопировать настройки > с измененной версией script в решении Frank.
cp -r "${SETTINGS_BUNDLE}/" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle"
Разница здесь в том, что скопированный пакет всегда называется Settings.bundle, независимо от имени источника.
Затем вам нужно добавить еще одну фазу сборки script, чтобы предотвратить ошибки подписи кода, когда только изменения находятся в наборах параметров. Это заставляет шаг подписания кода выполняться в каждой сборке. Это должно работать перед фазой сборки исходных файлов компиляции. Я назвал мой Force Codesign.
touch "${PROJECT_DIR}/relative/path/to/main.m"
Ответ 3
Для подчиненных источников существует плохо документированная пользовательская настройка сборки, которую можно добавить. Файлы могут быть исключены и включены из компиляции
Перейдите в свою целевую настройку > Нажмите кнопку + > Добавить пользовательскую настройку
Ключ: INCLUDED_SOURCE_FILE_NAMES
или EXCLUDED_SOURCE_FILE_NAMES
Значение - это список разделенных пробелами путей к файлам
См. ссылку:
http://lists.apple.com/archives/xcode-users/2009/Jun/msg00153.html
Ответ 4
Settings.bundle всегда копируется в область назначения независимо от того, будет ли выпущена или отлажена конфигурация. Итак, возможно, вам нужен следующий код:
if [ ${CONFIGURATION} == "Release" ]; then
rm -rf ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle
fi
Ответ 5
Я не эксперт оболочки script, но думаю, вам нужно место между квадратными скобками и условием. Кроме того, цитирование переменных может помочь:
if [ "${CONFIGURATION}" = "Debug" ] then
cp -r "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}"/.
fi
Что касается местоположения, я использую "$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME"
для корня моего пакета приложений OS X.