Как Xcode находит неявные целевые зависимости?

Иногда Xcode находит зависимости. Я думаю, это нормально, когда я тот, кто определяет отношения, и когда я становлюсь ленивым …

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

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

Цель и создаваемый продукт могут быть связаны с другой целью. Если цель требует вывода другой цели для сборки, считается, что первая цель зависит от второй. Если обе цели находятся в одном и том же рабочем пространстве, Xcode может обнаружить зависимость, и в этом случае он строит продукты в требуемом порядке. Такие отношения называются неявной зависимостью.

Источник: Библиотека разработчиков iOS → Концепции Xcode → Цель Xcode

One Solution collect form web for “Как Xcode находит неявные целевые зависимости?”

Этот ответ относится к Xcode 8.x, и я думаю, что для Xcode 9.0.

Во-первых, вы должны быть уверены, что «Найти неявные зависимости» включено на панели «Создание» схемы, которую вы пытаетесь построить.

Целевое «A» можно сделать «неявно» зависимым от целевого «B» двумя способами:

  1. У Target A есть фаза сборки Link Binary With Libraries, в которой есть библиотека в своем списке, которая имеет то же имя, что и Продукт B. Этот продукт может быть либо в одном проекте, либо в другом проекте в рабочей области. Обратите внимание, что я сказал «то же имя». Просто потому, что вы выбрали libA.a из цели A, это не означает, что неявные зависимости будут строить его, если у вас есть другой продукт libA.a в другой цели. Подробнее см. Ниже.
  2. В Target A есть «Фаза копирования файлов», которая копирует файл с базовым именем, которое соответствует продукту B. Обычно фаза сборки «Копировать файлы» не может ссылаться на файл, который не находится в том же проекте, что и его цель, но вы можете настроить зависимость между проектами, если вы создадите фиктивный файл для фазы «копировать» для копирования с тем же именем, что и продукт B. Например, если у вас есть рабочее пространство, содержащее два проекта ProjectA и ProjectB. ProjectA имеет TargetA, который создает libA.a, а ProjectB имеет TargetB, который создает libB.a. TargetA может получить TargetB для сборки libB.a, получив «поддельный» нулевой байт-файл как часть TargetA, получившего название libB.a, и этого было бы достаточно, чтобы получить libB.a, хотя libB.a в фазе «Копировать файлы» – это совершенно другой файл, кроме выхода продукта сборки TargetB. Если вы установите флажок «Копировать только при установке», Xcode фактически не выполнит копию, но все равно решит зависимость. Фактически вы можете удалить поддельный файл с вашего диска, созданный исключительно для того, чтобы что-то добавить в фазу «Копировать файлы» (но вы должны оставить его в своем проекте).

Так почему же кто-нибудь захочет сделать ужас, который является «2»? Я могу придумать пару причин.

  1. TargetA нуждается в некоторых файлах, скопированных / сгенерированных TargetB, но TargetB не создает библиотеку для ссылки. Вероятно, вы можете обойти это, если TargetB создаст небольшую фиктивную библиотеку, но это может быть болезненно по другим причинам.
  2. Предположим, что у меня были projectA, targetA и libA.a (и эквиваленты для проектов B, C и D), а libA.a зависела от libB.a и libC.a, которым необходимо было сначала создать libD.a (возможно, некоторые заголовки и / или генерируемые источники). Вы можете сделать все это, используя фазу «Link With Libraries» (aka solution # 1), но в этом случае вы получите две копии файлов .o в libD в последней связанной версии libA. Если вы сделаете это достаточно глубоко (например, рабочее пространство, в котором есть 40 проектов, которые имеют разные уровни зависимостей друг от друга), вы быстро получите огромные файлы библиотек с несколькими идентичными файлами .o в них, и ваши времена ссылок станут ужасающими.

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

Что произойдет, если у вас есть две цели внутри одного и того же рабочего пространства, которые генерируют продукты с тем же именем и зависят от них от третьей цели? Имплицитные зависимости будут выбирать один. Кажется, что он соответствует совпадению, основанному на базовом названии продукта (так что foo / bar.a и baz / bar.a одинаковы), и выберет первый найденный.

  • Как использовать настраиваемые параметры приложения в плагине для инъекций для Xcode?
  • Проект iOS с использованием sqlcipher больше не строится после установки Xcode 5
  • В контакте отсутствуют некоторые из требуемых дескрипторов ключей при отображении через CNContactViewController
  • xcode показывает предупреждения как ошибки
  • Как создать пользовательский контроль UIDatePicker
  • Ошибка значка приложения XCode
  • Как обрезать аудио в ios
  • Ограничение на размер каталога документов iOS
  • iOS: отладка не работает в XCode
  • Xcode ссылается на старые рамки
  • Должен ли отображаться индикатор службы местоположения (стрелка в строке состояния) при использовании функции startMonitoringSignificantLocationChanges?
  • Interesting Posts

    iOS 10 – UITableViewController прокручивается в нижней части загрузки

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

    Как я могу регистрировать каждый запрос / ответ с помощью Alamofire?

    Добавление тени в начало UIView

    Как отладить веб-сайт для ios.iphone с Windows PC

    Фоновый образ для UINavigationcontroller

    Создание пользовательского popover для iPhone – какой класс я должен использовать для подкласса?

    Отправка широты и долготы на сервер, когда приложение находится в фоновом режиме

    iOS устанавливает частоту кадров видео

    UICollectionView: активация, прокрутка и назначение первого ответчика удаленной ячейке

    iOS SDK: Как вызвать приложение электронной почты?

    Могу ли я использовать RestKit 0.20.3 для отправки запроса с параметрами OAuth, требуемыми Yelp?

    InputAccessoryView выше UITabBar

    iCloud с синхронизацией основных данных и файлов

    -webkit-overflow-scrolling: touch не распознается в хроме и на ios

    PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.