web-dev-qa-db-ja.com

複数のFrameworkサブプロジェクトでCocoaPodsを使用する方法

まず、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の関数としてポッドの依存関係を定義してすべてのターゲットに含める代わりに、より良い解決策はありますか?

28
Allen Hsu

これは素晴らしい質問であり、私も同様の状況で苦労しています。これは私の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で簡単に実行できることを願っています。これは実際にはあなたの質問に答えないことは知っていますが、それでも役立つかもしれません。

3

FrameworkAFrameworkBをローカル(静的ライブラリ)ポッドにすると、この問題を回避でき、すべての重複が排除され、ホストアプリに適切に統合されます。

例: https://github.com/rob-keepsafe/PodFrameworksIssue

  • masterブランチは、あなたが持っているような重複したクラスと包括的フレームワークを示しています
  • dedupedブランチは、内部動的フレームワークをローカルポッド(静的ライブラリとして)にして、依存関係を重複排除してリンクします
1
iwasrobbed

あなたの問題が私の問題と同じであるかどうかは完全にはわかりませんが、誰かが同様の問題を抱えている場合に備えて、ここでは私の解決策を残します。

コードをモジュール化するために使用する複数のサブプロジェクトを持つプロジェクトがあります(そして、自分のプライベートポッドに抽出する準備をする可能性もあります)。外部ポッドをサブプロジェクトの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
0
Tim Kofoed