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

Что наследует!: search_paths делать?

После просмотра собственного примера CocoaPods (от https://guides.cocoapods.org/syntax/podfile.html#abstract_target)

# Note: There are no targets called "Shows" in any of this workspace Xcode projects
abstract_target 'Shows' do
  pod 'ShowsKit'

  # The target ShowsiOS has its own copy of ShowsKit (inherited) + ShowWebAuth (added here)
  target 'ShowsiOS' do
    pod 'ShowWebAuth'
  end

  # The target ShowsTV has its own copy of ShowsKit (inherited) + ShowTVAuth (added here)
  target 'ShowsTV' do
    pod 'ShowTVAuth'
  end

  # Our tests target has its own copy of
  # our testing frameworks, and has access
  # to ShowsKit as well because it is
  # a child of the abstract target 'Shows'

  target 'ShowsTests' do
    inherit! :search_paths
    pod 'Specta'
    pod 'Expecta'
  end
end

Я не понимаю, почему inherit! :search_paths необходимо? Все 3 цели, ShowsiOS, ShowsTV и ShowsTests имеют доступ к ShowsKit из их родительской цели.

Конкретный пример для inherit! (из https://guides.cocoapods.org/syntax/podfile.html#inherit_bang) не добавляет ясности

target 'App' do
  target 'AppTests' do
    inherit! :search_paths
  end
end

Можете ли вы помочь мне понять, для чего inherit! :search_paths?

4b9b3361

Ответ 1

Цель, стоящая за inherit! Согласно https://guides.cocoapods.org/syntax/podfile.html#inherit_bang (что, я бы согласился, не очень понятно), заключается в предоставлении одного из 3 доступных режимов:

  • :complete Цель наследует все поведение от родителя.
  • :none Цель не наследует ни одно из действий от родителя.
  • :search_paths Цель наследует пути поиска только родителя.

В этом примере вопроса :search_paths режим :search_paths. Три разных режима играют разные роли при тестировании проекта Pod.

Вот дополнительная ссылка, имеющая отношение к Путям поиска Структуры в XCode, которые помогли прояснить некоторую путаницу для меня.

Ответ 2

Цель с зависимостью может использовать эту функцию. Лучший пример - Test target, который использует app target. В этом случае вы можете создать иерархию в вашем Podfile

target 'App' do
  target 'Tests' do
#    inherit! :none            # empty
#    inherit! :complete        # by default if you do not specify any inherit!
#    inherit! :search_paths    # uses only 'search' paths 
  end
end

Взгляните на каталог Pods/Targets Support Files/ и сравните

  • Pods-<App_target_name>/Pods-<App_target_name>.<debug/release>.xcconfig
  • Pods-<Test_target_name>/Pods-<Test_target_name>.<debug/release>.xcconfig

Вы обнаружите, что настройки, которые передаются реальной цели, отличаются для разных настроек inherit!. В случае с :search_paths - FRAMEWORK_SEARCH_PATHS, HEADER_SEARCH_PATHS... были унаследованы и переданы в соответствующие поля в Build Settings

Вариант использования inherit! :complete. Когда вы разрабатываете фреймворк со сторонней динамической фреймворком и у вас есть цель тестирования. Если вы запустите тесты, вы получите dyld: Library not loaded[About]. inherit! :complet на помощь.