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

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

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

У меня есть рабочее пространство, содержащее как MyApp.xcodeproj, так и Component.xcodeproj. Мое приложение имеет три конфигурации: Debug, App Store и In House, но компонент имеет только два: Debug и Release

В конфигурации Debug все работает нормально, но я не могу скомпилировать свое приложение в конфигурации App Store или In House, потому что имена конфигурации не совпадают. При попытке #import <Component/Component.h>

получить файл не найдена ошибка

Мне нужны конфигурации App Store и In House, и мне бы очень хотелось избежать изменения конфигураций компонентов, чтобы облегчить будущие обновления компонента.

Я знаю, что могу использовать CocoaPods для решения этой проблемы, но я хотел бы знать, есть ли простое решение в Xcode

4b9b3361

Ответ 1

Вы можете получить свой проект для компиляции с некоторыми настройками в настройках ваших приложений.

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

  • Добавьте новый DEFAULT_CONFIGURATION пользовательский параметр и определите конфигурацию. Вот как это должно выглядеть:

    Default Configuration Screenshot

  • Установите FRAMEWORK_SEARCH_PATHS в $(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME) для всех конфигураций, добавьте варианты Any OS X SDK и установите значение $(BUILD_DIR)/$(DEFAULT_CONFIGURATION). Установите HEADER_SEARCH_PATHS на $(FRAMEWORK_SEARCH_PATHS)/include и LIBRARY_SEARCH_PATHS на $(FRAMEWORK_SEARCH_PATHS). Вот как это должно выглядеть:

    Search Paths Screenshot

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

    #!/bin/bash
    
    CONFIGURATIONS=( "App Store:Release" "In House:Release" "Debug:Debug" )
    
    for CONFIGURATION in "${CONFIGURATIONS[@]}"; do
        xcproj --configuration "${CONFIGURATION%%:*}" write-build-setting DEFAULT_CONFIGURATION "${CONFIGURATION#*:}"
    done
    
    xcproj write-build-setting 'FRAMEWORK_SEARCH_PATHS' '$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)-$(PLATFORM_NAME)'
    xcproj write-build-setting 'FRAMEWORK_SEARCH_PATHS[sdk=macosx*]' '$(BUILD_DIR)/$(DEFAULT_CONFIGURATION)'
    
    xcproj write-build-setting 'HEADER_SEARCH_PATHS' '$(FRAMEWORK_SEARCH_PATHS)/include'
    xcproj write-build-setting 'LIBRARY_SEARCH_PATHS' '$(FRAMEWORK_SEARCH_PATHS)'
    
  • Если компонент распределен как статическая библиотека, вы делаете это здесь. Если компонент входит в структуру, вам необходимо обновить ссылку на его путь, отредактировав файл project.pbxproj в текстовом редакторе. В разделе PBXFileReference (под /* Begin PBXFileReference section */) найдите Component.framework и обновите его path следующим образом:

    name = Component.framework; path = "../$(DEFAULT_CONFIGURATION)/Component.framework"; sourceTree = BUILT_PRODUCTS_DIR; };
    

    Также убедитесь, что для параметра sourceTree установлено значение BUILT_PRODUCTS_DIR, то есть относительно построенных продуктов. После редактирования файла проекта это должно выглядеть так:

    Location Screenshot

Теперь ваш проект должен строиться так, как ожидалось.

Ответ 2

У меня была такая же проблема, но у меня было несколько конфигураций (Debug, TestFlight, Release, Предприятие) в моем приложении, а жирные конфигурации всегда не скомпилировались потому что он не смог найти рамки. Я действительно не хотел возиться с настройками проекта моих подпроектов, чтобы упростить их обновление.

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

В частности, я установил его:   $ (build_dir)/Релизы - $(PLATFORM_NAME)

Я также установил его рекурсивный. Это работает как для Simulator, так и для устройства, создавая в Xcode и командной строке.