Xcode 프로젝트의 podfile에서 여러 대상을 어떻게 지정합니까?


142

Xcode 4 프로젝트에서 CocoaPods를 사용하고 있으며 프로젝트에 대한 세 가지 대상 (디폴트 버전, 빌드 버전 및 데모 버전 빌드)이 있습니다. 모든 대상은 동일한 라이브러리를 사용하지만 CocoaPods는 기본 대상에 정적 라이브러리 및 검색 경로 만 추가합니다. 내 podfile은 다음과 같습니다.

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'

내가이 작업을 수행 할 수있는 유일한 방법은 모든 포드를 다시 나열하여 각 대상을 개별적으로 지정하는 것이 었습니다.

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

더 좋은 방법이 있습니까?


추상적 목표에 대해 읽어주세요. 필요한 것입니다. guides.cocoapods.org/syntax/podfile.html#abstract_target
Nik Kov

답변:


339

CocoaPods 1.0이 이에 대한 구문을 변경했습니다. 이제 다음과 같이 보입니다 :

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

구식 Pre CocoaPods 1.0 답변 :

더 좋은 방법이 있습니다! 여러 대상을 지정할 link_with수있는 위치를 확인하십시오 link_with 'MyApp', 'MyOtherApp'.

나는 이것을 link_with 'App', 'App-Tests'대상 테스트와 같은 단위 테스트와 함께 사용합니다 (대상 이름의 공백에주의하십시오).

예:

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 년 업데이트

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

좋습니다. 첫 번째 예제 podfile에서 link_with를 어디에 두시겠습니까? 예를 보여 주시겠습니까?
Austin

내 답변을 업데이트했습니다. 중요하지 않습니다.
Keith Smiley

4
나는 똑같은 것을 시도하고 있지만 내 경우에는 주 대상의 여러 대상 종속성에 연결하고 있습니다. 연결 단계에서 중복 기호 오류가 발생합니다. Cocoapods를 사용하여이 문제를 해결하는 방법을 알고 있습니까?
Fergal Rooney 2016

2
타겟 목록 주위의 괄호가 더 이상 필요하지 않으며 작동하지 않습니다. deets : guides.cocoapods.org/syntax/podfile.html#link_with
toblerpwn

2
@KeithSmiley 알겠습니다. 실제로는 여전히 그 공간에 문제가 있습니다. 공백이 없도록 모든 대상의 이름을 바꾸어야했습니다. Cocoapods에 link_with 대신 (모든 대상에 대해) 수행하지 않는 것이 있습니다.
hishamaus

91

더 나은 해결책은

# 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

참조 : http://natashatherobot.com/cocoapods-installing-same-pod-multiple-targets/


1
이것이 왜 더 나은 솔루션인지 설명해 주시겠습니까?
Warpling


9
여기에 약간의 설명을 추가하면 좋을 것입니다. (링크가 다운되는 경우를 대비하여 SO에 필요한 모든 정보를 유지하는 것이 좋습니다.) 또한 사람들이 문제를보고 link_with답을
찬성

이 방법은 모든 대상 (available_pods)과 대상 특정 포드에 사용할 수있는 많은 포드를 허용하기 때문에이 방법이 마음에 듭니다.
Apoc

이 솔루션은 잘 작동하지만 언급 할 가치가있는 것은 : 'def'값은 소문자이어야합니다.
Jerome

9

여러 대상이 동일한 포드를 공유하도록하려면 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

아니면 그냥

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

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


2

가장 쉬운 방법은 지정된 각 포드가 모든 대상과 연결되는 추상 대상을 사용하는 것입니다.

abstract_target 'someNameForAbstractTarget' do
  pod 'podThatIsForAllTargets'
end

target 'realTarget' do
  pod 'podThatIsOnlyForThisTarget'
end

는 안 realTarget내부 someNameForAbstractTarget 의 외측보다는?
Shubham Bakshi

다른 답변으로 판단하면 그렇게 작동 할 수 있습니다.
Shaaked Sayag
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.