Cocoapods で静的ライブラリを構築するときに重複シンボルを防ぐ 質問する

Cocoapods で静的ライブラリを構築するときに重複シンボルを防ぐ 質問する

Cocoapods と静的ライブラリに関する多くの質問を見てきましたが、そのほとんどは、最終的には静的ライブラリと最終ターゲット アプリを含む単一のワークスペースが存在することを前提としているようです。

私のシナリオでは、静的ライブラリを構築しています。より具体的には、ユーザーが利用できるようにMyLib.frameworkをハッキングしています。本当にMyLib.frameworkの依存関係をCocoapodsで管理したいのですが、ライブラリの消費者がまたCocoapods を使用します。

たとえば、私のライブラリにはAFNetworking依存関係があり、Cocoapodsで管理しています。ライブラリをビルドすると、AFNetworkingといくつかの「ダミー」ファイル/オブジェクトを含むlibPods.aにリンクされます。私のフレームワークのユーザーがCocoapodsを使用してビルドする場合、彼らのアプリでは、次のような画面が表示されます。

duplicate symbol _OBJC_METACLASS_$_PodsDummy_Pods in:
    /Users/erikkerber/Dropbox/Projects/MillMain/MyLib.framework/BuddySDK(Pods-dummy.o)
    /Users/erikkerber/Library/Developer/Xcode/DerivedData/MillMain-fngfqhlslygksgcfuciznkpqfrbr/Build/Products/Debug-iphonesimulator/libPods.a(Pods-dummy.o)
duplicate symbol _OBJC_CLASS_$_PodsDummy_Pods in:
    /Users/erikkerber/Dropbox/Projects/MillMain/MyLib.framework/BuddySDK(Pods-dummy.o)
    /Users/erikkerber/Library/Developer/Xcode/DerivedData/MillMain-fngfqhlslygksgcfuciznkpqfrbr/Build/Products/Debug-iphonesimulator/libPods.a(Pods-dummy.o)
ld: 2 duplicate symbols for architecture i386

AFNetworking 依存関係を追加すると、AFNetworking に関連する重複したシンボルも取得されると考えられます。

最終的には MyLib も Cocoapods とともに配布する予定ですが、MyLib.framework 自体も配布できるようにしたいと考えています。

Cocoapods を潜在的なユーザーにとって安全なものにしながら、自分のライブラリで Cocoapods を使用する方法はありますか?

ベストアンサー1

つまり、ビルド済みのライブラリを配布する唯一の良い方法は、ない依存関係のいずれかを含めますが、それはユーザーに任せます。つまり、あなたの例では、ユーザーに AFNetworking をプロジェクトに追加する方法も指示します。ファイルに関しても基本的に同じことが当てはまりますdummy

そうは言っても、もちろん、複数のビルド済みバリアントを選択することもできます。

  • すべての依存関係を含めます。
  • ライブラリのソースのみをインクルードし、依存関係はユーザーに任せます。

私たちは、あなたが望む目的のために、スタンドアロンの静的ライブラリを生成するプラグインを作成することについて話し合ってきましたが、それはまだ開始されておらず、おそらくもう少し時間がかかるでしょう。(誰かが時間を持つまで。)

回避策としては、Podfileのpost_installダミー ファイルをすべて削除します。(これらは、Testflight などの非ソース ライブラリにのみ必要です。) たとえば、次のようになります。

post_install do |installer|
  installer.project.targets.each do |target|
    source_files = target.source_build_phase.files
    dummy = source_files.find do |file|
      # TODO Fix this to the actual filename
      # puts "File: #{file.file_ref.name}"
      file.file_ref.name == 'TheDummyFile.m'
    end
    puts "Deleting source file #{dummy.inspect} from target #{target.inspect}."
    source_files.delete(dummy)
  end
end

これはテストされていないコードです。

フックpost_installはCocoaPodsインストーラーオブジェクトを生成し、そこからPods.xcodeprojターゲットを取得できます。そのドキュメントは以下にあります。ここそこからドリルダウンして、このフックを実行した後にディスクに保存されるプロジェクトに対して好きな操作を実行できます。

おすすめ記事