Search code examples
xcodetargetcocoapods

How do I specify multiple targets in my podfile for my Xcode project?


I'm using CocoaPods with my Xcode 4 project and I have three targets for my project (the default, one for building a lite version and one for building a demo version). All the targets use the same libraries, but CocoaPods is only adding the static library and search paths to the primary target. My podfile looks like this:

platform :ios, '5.0'

pod 'TestFlightSDK', '>= 1.1'
pod 'MBProgressHUD', '0.5'
pod 'iRate', '>= 1.6.2'
pod 'TimesSquare', '1.0.1'
pod 'AFNetworking', '1.1.0'
pod 'KKPasscodeLock', '0.1.5'
pod 'iCarousel', '1.7.4'

The only way I was get this to work was to specify each target individually with all the the pods listed again.

platform :ios, '5.0'

target :default do  
    pod 'TestFlightSDK', '>= 1.1'
    pod 'MBProgressHUD', '0.5'
    pod 'iRate', '>= 1.6.2'
    pod 'TimesSquare', '1.0.1'
    pod 'AFNetworking', '1.1.0'
    pod 'KKPasscodeLock', '0.1.5'
    pod 'iCarousel', '1.7.4'
end

target :lite do 
    link_with 'app-lite'

    pod 'TestFlightSDK', '>= 1.1'
    pod 'MBProgressHUD', '0.5'
    pod 'iRate', '>= 1.6.2'
    pod 'TimesSquare', '1.0.1'
    pod 'AFNetworking', '1.1.0'
    pod 'KKPasscodeLock', '0.1.5'
    pod 'iCarousel', '1.7.4'
end

target :demo do 
    link_with 'app-demo'

    pod 'TestFlightSDK', '>= 1.1'
    pod 'MBProgressHUD', '0.5'
    pod 'iRate', '>= 1.6.2'
    pod 'TimesSquare', '1.0.1'
    pod 'AFNetworking', '1.1.0'
    pod 'KKPasscodeLock', '0.1.5'
    pod 'iCarousel', '1.7.4'
end

Is there a better way to do this?


Solution

  • Since CocoaPods 1.0 has changed the syntax, instead of using link_with, do something like:

    # Note; name needs to be all lower-case.
    def shared_pods
        pod 'SSKeychain', '~> 0.1.4'
        pod 'INAppStoreWindow', :head
        pod 'AFNetworking', '1.1.0'
        pod 'Reachability', '~> 3.1.0'
        pod 'KSADNTwitterFormatter', '~> 0.1.0'
        pod 'MASShortcut', '~> 1.1'
        pod 'MagicalRecord', '2.1'
        pod 'MASPreferences', '~> 1.0'
    end
    
    target 'Sail' do
        shared_pods
    end
    
    target 'Sail-iOS' do
        shared_pods
    end
    

    Old answer Pre CocoaPods 1.0:

    Yes there is a better way! Check out link_with where you can do link_with 'MyApp', 'MyOtherApp' to specify multiple targets.

    I use this with unit tests like link_with 'App', 'App-Tests' (beware of spaces in target's names).

    Example:

    platform :osx, '10.8'
    
    link_with 'Sail', 'Sail-Tests'
    
    pod 'SSKeychain', '~> 0.1.4'
    pod 'INAppStoreWindow', :head
    pod 'AFNetworking', '1.1.0'
    pod 'Reachability', '~> 3.1.0'
    pod 'KSADNTwitterFormatter', '~> 0.1.0'
    pod 'MASShortcut', '~> 1.1'
    pod 'MagicalRecord', '2.1'
    pod 'MASPreferences', '~> 1.0'
    

    Approach using abstract_target:

    In below example, the 'ShowsiOS', 'ShowsTV' and 'ShowsTests' targets have their own separate pods, plus ShowsKit inherited, because they are all child of the dummy target 'Shows'.

    # Note: There are no targets called "Shows" in any of this workspace's Xcode projects.
    abstract_target 'Shows' do
      pod 'ShowsKit'
    
      target 'ShowsiOS' do
        pod 'ShowWebAuth'
      end
    
      target 'ShowsTV' do
        pod 'ShowTVAuth'
      end
    
      # Our tests target has its own copy
      # of our testing frameworks
      # (beside inheriting ShowsKit pod).
    
      target 'ShowsTests' do
        inherit! :search_paths
        pod 'Specta'
        pod 'Expecta'
      end
    end