Como especifico vários destinos no meu podfile para o meu projeto Xcode?

142

Estou usando o CocoaPods no meu projeto do Xcode 4 e tenho três destinos para o meu projeto (o padrão, um para a construção de uma versão lite e outro para a construção de uma versão demo). Todos os destinos usam as mesmas bibliotecas, mas o CocoaPods está adicionando apenas a biblioteca estática e os caminhos de pesquisa ao destino principal. Meu podfile fica assim:

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'

A única maneira de fazer isso funcionar era especificar cada alvo individualmente com todos os pods listados novamente.

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

Existe uma maneira melhor de fazer isso?

Austin
fonte
Por favor, leia sobre o objetivo abstrato. É o que você precisa. Guides.cocoapods.org/syntax/podfile.html#abstract_target
Nik

Respostas:

339

CocoaPods 1.0 mudou a sintaxe para isso. Agora, fica assim:

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

ATUALIZADO Pre CocoaPods 1.0 resposta:

Sim, existe uma maneira melhor! Confira link_withonde você pode fazer link_with 'MyApp', 'MyOtherApp'para especificar vários destinos.

Eu uso isso com testes de unidade como link_with 'App', 'App-Tests'(cuidado com os espaços nos nomes dos alvos).

Exemplo:

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'

2017 update

Você pode 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
fonte
Ótimo, então onde você colocaria o link_with no meu primeiro exemplo de arquivo? Você pode me mostrar um exemplo?
Austin
Atualizei minha resposta. Realmente não deveria importar.
Keith Smiley
4
Estou tentando a mesma coisa, mas no meu caso, estou vinculando a várias dependências de destino do destino principal. Isso resulta em erro de símbolos duplicados na fase de vinculação. Você sabe como contornar isso usando Cocoapods?
Fergal Rooney
2
Parece que os colchetes da sua lista de destinos não são mais necessários (e não funcionam?). deets: guides.cocoapods.org/syntax/podfile.html#link_with
toblerpwn
2
@KeithSmiley eu vejo. Eu tenho tido problemas com esses espaços ainda, na verdade. Eu tive que renomear todos os meus destinos para não ter espaços. É péssimo que o Cocoapods não tenha um (faça para todos os destinos) em vez de link_with.
hishamaus
91

Eu acho que melhor solução é

# 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

Referência: http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/

Adarsh ​​GJ
fonte
1
Você se importa de explicar por que essa é uma solução melhor?
Warpling
1
@Warpling: Por favor, passe por este natashatherobot.com/…
Adarsh ​​GJ
9
Seria ótimo se você adicionasse um pouco dessa explicação aqui. (É bom para manter todas as informações necessárias sobre SO em ligações de caso ir para baixo, etc) Também pode ajudar as pessoas a ver o problema com link_withe upvote sua resposta :)
Warpling
Eu gosto dessa abordagem porque permite um monte de pods disponíveis para todos os destinos (available_pods) e segmentar pods específicos.
Apoc
Essa solução funciona bem, mas algo que vale a pena mencionar: seus valores 'def' devem estar em minúsculas.
Jerome
9

Se você deseja que vários destinos compartilhem os mesmos pods, use um 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

ou apenas

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

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

Adam Smaka
fonte
2

A maneira mais fácil é usar um destino abstrato, onde cada pod especificado será vinculado a todos os destinos.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end
Sayag sacudido
fonte
O interior não deveria realTargetentrar e não sair dele? someNameForAbstractTarget
Shubham Bakshi 19/03
A julgar pelas outras respostas, também poderia funcionar dessa maneira.
Shaked Sayag 20/03