Xcodeプロジェクトのポッドファイルで複数のターゲットを指定するにはどうすればよいですか?


142

Xcode 4プロジェクトでCocoaPodsを使用していて、プロジェクトに3つのターゲットがあります(デフォルト、ライトバージョンのビルド用とデモバージョンのビルド用の1つ)。すべてのターゲットは同じライブラリを使用しますが、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

回答:


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

古くなった 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

すばらしいので、最初のサンプルポッドファイルのlink_withをどこに配置しますか?例を見せていただけますか?
オースティン

私の答えを更新しました。それは本当に重要ではありません。
キーススマイリー、

4
私は同じことを試みていますが、私の場合、メインターゲットの複数のターゲット依存関係にリンクしています。これにより、リンクフェーズでシンボルの重複エラーが発生します。Cocoapodsを使用してこれを回避する方法を知っていますか?
Fergal Rooney 2013

2
ターゲットのリストを囲む括弧が不要になったようです(機能しませんか?)deets:guides.cocoapods.org/syntax/podfile.html#link_with
toblerpwn

2
@KeithSmileyなるほど。実際、私はそれらのスペースでまだ問題を抱えています。すべてのターゲットの名前をスペースがないように変更する必要がありました。Cocoapodsがlink_withの代わりに(すべてのターゲットに対して実行)を持っていないことを確認します。
hishamaus 2014

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
これがより良い解決策である理由を説明してもらえますか?
2015

1
@ワープリング:このnatashatherobot.com/…
Adarsh GJ

9
ここにその説明を少し追加していただければ幸いです。(リンクがダウンした場合などに備えて、SOで必要なすべての情報を保持しておくと便利です)また、人々が問題をlink_with確認して回答に
賛成票を投じるのに

このアプローチが好きなのは、すべてのターゲット(available_pods)と特定のターゲットポッドで利用可能な一連のポッドが許可されるためです。
Apoc 2015年

このソリューションは正常に機能しますが、言及する価値があるものです。「def」値は小文字である必要があります。
ジェローム

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

他の答えから判断すると、それもそのように機能する可能性があります。
Shaky Sayag
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.