¿Cómo especifico múltiples objetivos en mi podfile para mi proyecto Xcode?

143

Estoy usando CocoaPods con mi proyecto Xcode 4 y tengo tres objetivos para mi proyecto (el predeterminado, uno para construir una versión lite y otro para construir una versión demo). Todos los objetivos usan las mismas bibliotecas, pero CocoaPods solo agrega la biblioteca estática y las rutas de búsqueda al objetivo principal. Mi podfile se ve así:

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'

La única forma en que conseguí que esto funcionara fue especificar cada objetivo individualmente con todos los pods enumerados nuevamente.

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

¿Hay una mejor manera de hacer esto?

Austin
fuente
Por favor, lea sobre el objetivo abstracto. Es lo que necesitas. guides.cocoapods.org/syntax/podfile.html#abstract_target
Nik Kov

Respuestas:

340

CocoaPods 1.0 ha cambiado la sintaxis para esto. Ahora se ve así:

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

ANTICUADO CocoaPods 1.0 ACTUALIZADA:

Sí, hay una mejor manera! Mira link_withdónde puedes hacerlink_with 'MyApp', 'MyOtherApp' para especificar múltiples objetivos.

Lo uso con pruebas unitarias como link_with 'App', 'App-Tests' (cuidado con los espacios en los nombres de los objetivos).

Ejemplo:

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'

Actualización 2017

Puedes usar 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
Keith Smiley
fuente
Genial, entonces, ¿dónde pondrías el link_with en mi primer ejemplo de podfile? ¿Me puede mostrar un ejemplo?
Austin
Actualicé mi respuesta. Realmente no debería importar.
Keith Smiley
44
Estoy intentando lo mismo, pero en mi caso, estoy vinculando a múltiples dependencias de destino del objetivo principal. Esto está dando como resultado un error de símbolos duplicados en la fase de enlace. ¿Sabes cómo solucionar esto usando Cocoapods?
Fergal Rooney
2
Parece que los corchetes alrededor de su lista de objetivos ya no son necesarios (¿y no funcionan?). deets: guides.cocoapods.org/syntax/podfile.html#link_with
toblerpwn
2
@KeithSmiley Ya veo. Todavía he tenido problemas con esos espacios, en realidad. Tuve que cambiar el nombre de todos mis objetivos para no tener espacios. Es una mierda que Cocoapods no tenga un (hacer para todos los objetivos) en lugar de link_with.
hishamaus
91

Creo que la mejor solución es

# Podfile

platform :ios, '8.0'

use_frameworks!

# Available pods

def available_pods
    pod 'AFNetworking', '1.1.0'
    pod 'Reachability', '~> 3.1.0'
end

target 'demo' do
  available_pods
end

target 'demoTests' do
    available_pods
end

Referencia de: http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/

Adarsh ​​GJ
fuente
1
¿Te importaría explicar por qué esta es una mejor solución?
Warpling
1
@Warpling: revisa este natashatherobot.com/…
Adarsh ​​GJ
9
Sería genial si agregaras un poco de esa explicación aquí. (Es bueno para mantener toda la información necesaria sobre por lo que en caso de enlaces bajar, etc.) También podría ayudar a la gente ve el problema link_withy upvote su respuesta :)
Warpling
Me gusta este enfoque porque permite un montón de pods disponibles para todos los objetivos (available_pods) y pod específicos.
Apoc
Esta solución funciona bien, pero es algo que vale la pena mencionar: sus valores 'def' deben estar en minúsculas.
Jerome
9

Si desea que varios objetivos compartan los mismos pods, use un abstract_target.

# There are no targets called "Shows" in any Xcode projects
abstract_target 'Shows' do
  pod 'ShowsKit'
  pod 'Fabric'

  # Has its own copy of ShowsKit + ShowWebAuth
  target 'ShowsiOS' do
    pod 'ShowWebAuth'
  end

  # Has its own copy of ShowsKit + ShowTVAuth
  target 'ShowsTV' do
    pod 'ShowTVAuth'
  end
end

o solo

pod 'ShowsKit'
pod 'Fabric'

# Has its own copy of ShowsKit + ShowWebAuth
target 'ShowsiOS' do
  pod 'ShowWebAuth'
end

# Has its own copy of ShowsKit + ShowTVAuth
target 'ShowsTV' do
  pod 'ShowTVAuth'
end

fuente: https://guides.cocoapods.org/using/the-podfile.html

Adam Smaka
fuente
2

La forma más fácil es usar un objetivo abstracto, donde cada pod especificado se vinculará con todos los objetivos.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end
Sayag sacudido
fuente
¿No debería realTargetentrar adentro en someNameForAbstractTarget lugar de afuera?
Shubham Bakshi
A juzgar por las otras respuestas, también podría funcionar de esa manera.
Sacudido Sayag