Подтвердить что ты не робот

Как я могу условно включить файл на основе конфигурации сборки в 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) у меня нет глупой синтаксической ошибки где-то.

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

4b9b3361

Ответ 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.