複数のプロジェクトを含むワークスペースがあります。各顧客には独自のプロジェクトがあり、各顧客のプロジェクトは
- コア プロジェクト: 共通コードを含む静的ライブラリ
- インターフェイス プロジェクト: 共通インターフェイスを持つ静的ライブラリ、つまり UIViewController コード
Interface ライブラリも Core に依存しています。
各プロジェクトには 2 つのターゲットがあります。通常のターゲットとテストのターゲットなので、
- コア、コアテスト
- インターフェース、InterfaceTests
- 顧客、顧客テスト
現在、アプリのすべての側面が大幅に開発されているため、構造のどの部分でもいつでも変更が発生する可能性があるため、すべてのプロジェクトを同じワークスペースと同じリポジトリに配置しています。
CocoaPods を使用して、プロジェクトの依存関係を管理したいと考えています。簡単にするために、すべてのテスト ターゲットでOCMockを使用し、すべての通常のターゲットでNewRelicAgentを使用し、コア ターゲットでのみReachabilityを使用できるとしましょう。
Podfile は次のようになります。
workspace 'CompanyWorkspace'
xcodeproj 'Core/Core.xcodeproj'
xcodeproj 'Interface/Interface.xcodeproj'
xcodeproj 'Customer/Customer.xcodeproj'
target :Core do
platform :ios, '6.0'
xcodeproj 'Core/Core.xcodeproj'
pod 'NewRelicAgent', '~> 5.1'
pod 'Reachability', '~> 3.2'
end
target :CoreTests do
platform :ios, '6.0'
xcodeproj 'Core/Core.xcodeproj'
pod 'OCMock', '~> 3.1'
end
target :Interface do
platform :ios, '6.0'
xcodeproj 'Interface/Interface.xcodeproj'
pod 'NewRelicAgent', '~> 5.1'
end
target :InterfaceTest do
platform :ios, '6.0'
xcodeproj 'Interface/Interface.xcodeproj'
pod 'OCMock', '~> 3.1'
end
target :Customer do
platform :ios, '7.0'
xcodeproj 'Customer/Customer.xcodeproj'
pod 'NewRelicAgent', '~> 5.1'
end
target :CustomerTests do
platform :ios, '7.0'
xcodeproj 'Customer/Customer.xcodeproj'
pod 'OCMock', '~> 3.1'
end
スタティック ライブラリ Core.a を Interface.a のビルド フェーズに追加し、ユーザー ヘッダー検索パスを変更してヘッダーを検出することで、構造間の依存関係を解決しました。Customer プロジェクトでは、Core.a と Interface.a をビルド フェーズに追加し、ユーザー ヘッダーの検索パスを変更して、Core と Interface からコードを見つけられるようにしました。
このアプローチの問題は、Core と Interface がビルドしてテストを適切に実行することですが、Customer.app をビルドしようとすると、多数の重複シンボルエラーが発生します。これは、CocoaPods の target キーワードが依存関係が構成された静的ライブラリを生成するため、Customer のビルド時に Core からのコードを 2 倍インクルードしようとするためだと思います。この問題を解決する方法はありますか?