Как установить зависимости проекта Xcode с различными конфигурациями сборки?

У меня есть рабочая область Xcode 7.3 с тремя проектами: App, FrameworkA и FrameworkB. Каждый проект имеет одну цель. Это iOS, поэтому целью фреймворка являются Cocoa Touch Frameworks, что означает фреймворки, содержащие динамически связанные общие библиотеки.

Приложение зависит от платформы A, которая зависит от платформы B. Эти зависимости работают, поскольку A правильно связывается с продуктом сборки B, а приложение правильно связывается с обеими платформами A и B и встраивает их (поскольку одна платформа не может встраивать другую). , похоже, пакет приложений должен связать и внедрить как прямые, так и транзитивные зависимости.)

Но вот моя проблема. Фреймворки A и B имеют обычные конфигурации сборки, Debug и Release. Приложение имеет дополнительную конфигурацию сборки, LocalRelease, которая запускается действием «Выполнить сборку» и используется для создания оптимизированной сборки (например, «Выпуск»), но кода, подписанного с идентификатором разработчика (например, «Отладка»).

Когда я пытаюсь собрать приложение с этой конфигурацией сборки LocalRelease, это прерывает сборку, поскольку нарушает зависимости от фреймворков A и B. Я полагаю, что это потому, что эти фреймворки не имеют конфигураций сборки LocalRelease, поэтому Xcode никогда не помещает свои продукты сборки в Папка LocalRelease-iphoneos, как и в App.

Итак, мой узкий вопрос: как мне настроить параметры сборки, чтобы проект с нестандартным именем конфигурации сборки (например, LocalRelease) мог зависеть от других проектов, которые используют только стандартные имена конфигурации сборки? Я надеюсь, что есть простой способ сделать это, не требующий добавления скриптов или файлов xcconfig, но если они необходимы, я хотел бы понять, почему.

И мой более широкий вопрос: вообще плохая ли идея вводить дополнительные конфигурации сборки, потому что они не позволяют плавно взаимодействовать зависимостям между проектами в общем рабочем пространстве? Я был вынужден определить эту третью конфигурацию, потому что мне нужна была оптимизированная локальная сборка, я не хотел определять новую схему и хотел, чтобы выбор типа сборки выражался различными действиями сборки (запуск, профиль, выпуск) единая схема.

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


person algal    schedule 07.05.2016    source источник


Ответы (2)


Я отправил заявку в службу технической поддержки разработчиков Apple по этому поводу и поговорил с инженерами Xcode на WWDC.

Ответы на мои собственные вопросы

как настроить параметры сборки, чтобы проект с нестандартным именем конфигурации сборки (например, LocalRelease) мог зависеть от других проектов, использующих только стандартные имена конфигурации сборки?

Ответ: сделать нельзя.

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

Ответ: да, это плохая идея.

Таким образом, создание новой именованной конфигурации сборки — не лучший способ сделать то, что я пытался сделать. К сожалению, кажется, что «самое простое» решение состоит в том, чтобы использовать файлы xcconfig и вручную изменять файлы конфигурации для такого рода вещей.

person algal    schedule 13.09.2016
comment
Почему вы не можете установить параметр CONFIGURATION_BUILD_DIR для вашей конфигурации LocalRelease в соответствии с конфигурацией Release? Таким образом, я думаю, что проекты фреймворка должны быть найдены в том же месте, что и конфигурация localrelease. - person Kevlar; 01.07.2018
comment
Добавьте $(BUILD_ROOT)/Release в параметр сборки FRAMEWORK_SEARCH_PATHS для нестандартных конфигураций, чтобы подобрать встроенные платформы, которые помещаются в папку Release. - person Jacob Gorban; 19.11.2020

В Xcode 11 кажется, что если в зависимости проекта не найдена соответствующая конфигурация, система сборки возвращается к настройке Использовать {конфигурацию здесь} для сборок из командной строки в конфигурациях проекта.

Интерфейс настроек Xcode

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

person Aaron T    schedule 03.08.2020
comment
А затем добавьте $(BUILD_ROOT)/Release в параметр сборки FRAMEWORK_SEARCH_PATHS для нестандартных конфигураций основного проекта, чтобы подобрать встроенные фреймворки, которые помещаются в папку Release (или выбранную в Use {configuration here} как описано в ответе) - person Jacob Gorban; 19.11.2020
comment
Проблема в том, что когда вы собираете конфигурацию Debug, обычно эта конфигурация уже существует во внешней среде, поэтому в (BUILD_ROOT)/Release ничего нет, и фаза сборки завершается сбоем. - person strangetimes; 09.01.2021