まず、use_frameworkをオンにしました。 Podfile内。
メインプロジェクトがMAIN_APPで、2つのサブプロジェクトがFRAMEWORK_AとFRAMEWORK_Bであるとします。
MAIN_APPにはFRAMEWORK_AとFRAMEWORK_Bが必要であり、FRAMEWORK_BにもFRAMEWORK_Aが必要です。
すべてのプロジェクト/ターゲットは、CocoaPodsを使用してサードパーティのライブラリを管理しています。
今のところ、私のPodfileは次のようになります。
target :MAIN_APP do
project 'MAIN_APP'
pod 'PodA'
end
target :FRAMEWORK_A do
project 'FRAMEWORK_A'
pod 'PodB'
end
target :FRAMEWORK_B do
project 'FRAMEWORK_B'
pod 'PodC'
end
FRAMEWORK_Bの設定を構築するためにFRAMEWORK_Aを手動で追加し、MAIN_APPの設定を構築するためにFRAMEWORK_AとFRAMEWORK_Bの両方を追加しました。
すべてのコードは適切にコンパイルされますが、PodBのフレームワークをロードできないため、MAIN_APPを実行するとクラッシュします。
手動でPodBをMAIN_APPおよびFRAMEWORK_Bに追加することもできますが、Podfileでこの種のターゲット依存関係を定義することは可能ですか?
ところで、pod install
、私は警告を受けました:
[!] Podfileにはフレームワークターゲットが含まれていますが、そのフレームワークターゲットにはPodfileにホストターゲット(フレームワークを埋め込むターゲット)は含まれていません。
このプロジェクトがフレームワーク開発を目的としている場合は、このメッセージを無視できます。それ以外の場合は、これらのフレームワークを組み込んだターゲットをPodfileに追加して、このメッセージを表示しないようにします(例:テストターゲット)。
私が知っているように、私はホストターゲットにネストされたターゲットを使うことができます:
target :FRAMEWORK_A
target :MAIN_APP
end
end
したがって、CocoaPodsはMAIN_APPをセットアップしてFRAMEWORK_Aを使用し、FRAMEWORK_Aからポッドの依存関係を継承します。しかし、私は次のような複数の依存関係ではそれを行うことができないようです:
target :FRAMEWORK_A
target :MAIN_APP
end
end
target :FRAMEWORK_B
target :MAIN_APP
end
end
ターゲット:MAIN_APPを2回宣言することはできないためです。
Podfileの関数としてポッドの依存関係を定義してすべてのターゲットに含める代わりに、より良い解決策はありますか?
これは素晴らしい質問であり、私も同様の状況で苦労しています。これは私のPodFileです:
platform :ios, '8.0'
workspace 'mygreatapp.xcworkspace'
project 'app/MyGreatApp/MyGreatApp.xcodeproj'
project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
abstract_target 'This can say whatever you want' do
target 'MyGreatApp' do
project 'app/MyGreatApp/MyGreatApp.xcodeproj'
pod 'AFNetworking', '~> 2.6.0'
pod 'PromiseKit', '~> 1.5'
pod 'PromiseKit/Join'
pod 'KVOController', '~> 1.0'
pod 'FLAnimatedImage', '~> 1.0'
pod 'Crashlytics', '~> 3.3'
pod 'SSZipArchive'
end
target 'MyGreatAppTests' do
project 'app/MyGreatApp/MyGreatApp.xcodeproj'
pod 'OCMock', '~> 3.1'
end
target 'MyGreatFramework' do
project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
pod 'SSZipArchive'
end
target 'MyGreatFrameworkTests' do
project 'platform/MyGreatFramework/MyGreatFramework.xcodeproj'
pod 'OCMock', '~> 3.1'
end
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['ENABLE_BITCODE'] = 'NO'
end
end
end
end
ご覧のとおり、私はフレームワークを使用しておらず、abstract_target
でグループ化します。これらの種類の依存関係がCocoaPodsで簡単に実行できることを願っています。これは実際にはあなたの質問に答えないことは知っていますが、それでも役立つかもしれません。
FrameworkA
とFrameworkB
をローカル(静的ライブラリ)ポッドにすると、この問題を回避でき、すべての重複が排除され、ホストアプリに適切に統合されます。
例: https://github.com/rob-keepsafe/PodFrameworksIssue
master
ブランチは、あなたが持っているような重複したクラスと包括的フレームワークを示していますdeduped
ブランチは、内部動的フレームワークをローカルポッド(静的ライブラリとして)にして、依存関係を重複排除してリンクしますあなたの問題が私の問題と同じであるかどうかは完全にはわかりませんが、誰かが同様の問題を抱えている場合に備えて、ここでは私の解決策を残します。
コードをモジュール化するために使用する複数のサブプロジェクトを持つプロジェクトがあります(そして、自分のプライベートポッドに抽出する準備をする可能性もあります)。外部ポッドをサブプロジェクトの1つにインポートすると、「画像がない」ためにdyldエラーが発生するという問題がありました。
サブプロジェクトを見つけられるようにするには、常にメインプロジェクトにポッドを含める必要があると結論付けたこの中型の記事を見つけました。メインプロジェクトで外部ポッドを使用していません。 ( https://medium.com/@akfreas/how-to-use-cocoapods-with-your-internal-ios-frameworks-192aa472f64b )(ポッドファイルを正しく記述していない可能性がありますまたは可能な限り効率的に、しかしこれは私の問題を解決するようです)
したがって、私のpodfileは次のようになります。
abstract_target "RandomName" do
target "MainProject" do
inherit! :complete
workspace './MainProject.xcodeproj'
pod 'Moya', '~> 13.0'
pod 'KeychainSwift', '~> 17.0'
end
target "ModuleA" do
project './ModuleA/ModuleA.xcodeproj'
workspace './ModuleA/ModuleA.xcodeproj'
pod 'Moya', '~> 13.0'
end
target "ModuleB" do
project './ModuleB/ModuleB.xcodeproj'
workspace './ModuleB/ModuleB.xcodeproj'
pod 'KeychainSwift', '~> 17.0'
end
end