What does inherit! :search_paths do?
After looking at CocoaPods' own example (from https://guides.cocoapods.org/syntax/podfile.html#abstract_target)
# Note: There are no targets called "Shows" in any of this workspace's 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
I don't see why inherit! :search_paths
is necessary? All 3 targets, ShowsiOS
, ShowsTV
and ShowsTests
have access to ShowsKit
from their parent target.
The specific example for inherit!
(from https://guides.cocoapods.org/syntax/podfile.html#inherit_bang) doesn't add any clarity
target 'App' do
target 'AppTests' do
inherit! :search_paths
end
end
Can you help me understand what inherit! :search_paths
is for?
The purpose behind behind inherit!
, according to https://guides.cocoapods.org/syntax/podfile.html#inherit_bang
(which I would agree is not very clear), is to provide one of 3 available modes:
-
:complete
The target inherits all behaviour from the parent. -
:none
The target inherits none of the behaviour from the parent. -
:search_paths
The target inherits the search paths of the parent only.
In this question's example it is the :search_paths
mode that is being expressed. The three different modes serve different roles when testing a Pod project.
Here is an additional link pertaining to Framework Search Paths in Xcode that helped clear some confusion for me.
CocaPods and inherit!
An inner target with dependency can use this functionality. The best example is Test target
that uses app target
. In this case you can create a hierarchy in your Podfile
[About]
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
Take a look at generated Pods/Targets Support Files/
directory and compare
Pods-<App_target_name>/Pods-<App_target_name>.<debug/release>.xcconfig
Pods-<Test_target_name>/Pods-<Test_target_name>.<debug/release>.xcconfig
You will find that settings which are passed to to the project's target[About] are different for different inherit!
setting.
In case with inherit! :search_paths
- FRAMEWORK_SEARCH_PATHS
, HEADER_SEARCH_PATHS
... of inner target were inherited from outer target and were passed to the corresponding fields in Build Settings
Use case of inherit! :complete
. When you develop a framework that has a third-party dynamic framework and you have a test target. If you do not do this and run tests you will get dyld: Library not loaded
[About]