web-dev-qa-db-ja.com

クラスXは、<framework>と<application>の両方に実装され、2つのうちの1つが使用されますが、その1つは未定義です

私はこの警告を受けています:

Class X is implemented in both <framework> and <application> one of the two will be used, which one is undefined

この警告はウェブ全体でかなりカバーされていますが、私が抱えている特定の問題に答えるものが見つかりませんでした。

シナリオ

MyFrameworkとMyApplicationを(MyFrameworkのテスト/デモアプリケーションとして)ビルドしました。

MyFrameworkはCocoaPod(これをCoolPodと呼びます)を使用します。これもMyApplicationで使用します(MyFrameworkのコンシューマーも使用することを想定するのが妥当です)。

MyFrameworkを.framework(クローズドソース用)として配布できるようにする必要があります。ただし、これは、MyFrameworkがそのコンパイル済みライブラリにCoolPodを埋め込むことを意味します。

MyFrameworkとCoolPodをMyApplicationにインポートすると、CoolPodのクラスがMyFrameworkのライブラリに既に含まれているため(CoolPodが埋め込まれているため)、この競合が発生します(上記の警告が出力されます)。

したがって、次のような構造になります。

CoolPod -> MyFramework \
                        MyApplication
               CoolPod /

質問

この競合を回避するにはどうすればよいですか?

  • MyApplicationがCoolPodをMyFrameworkに提供する方法はありますか?
  • MyFrameworkを介してCoolPodのヘッダーをパイプする必要がありますか?

MyApplicationにCoolPodのヘッダー(libではない)を含めることを検討しましたが、これは単純なケースでは非常に複雑に見えます。

どんな助けでも大歓迎です、これは今私を本当に妨げています。

おかげで、

インジゴ

41
Zenton

私の解決策は、ココアポッドからソースコードを取得し、ココアタッチフレームワークを作成することでした。次に、フレームワークをAPIとテストアプリにリンクしました。これは素晴らしいことではありませんが、私がすぐにできるすべてです。 Cocoapodsはフレームワークのサポートに取り組んでいるので、このソリューションはすぐに古くなる可能性があります。

私の会社も依存関係(Java)とビルドスクリプトにGradleを使用しています。そこで、私のフレームワークとサポートするフレームワーク(cocoapodフレームワーク)をビルドし、それらからユニバーサルフレームワークを作成する、groovy/gradleビルドタスクを作成しました。次に、すべてのフレームワークを圧縮します。これは、すべての要件を備えた1つのZipを配布できることを意味します。これは明らかに配布するのに最適な方法ではありませんが(クローズドソースフレームワークに依存するCocoapodを介して配布することに移行します)、セットアップは高速です。

2
Zenton

クローズドソースの静的ライブラリについては、 cocoapods-packager をお勧めします。それがフレームワークのサポートかどうかはわかりません。

2
orta

簡単な解決策が必要な場合は、MyFrameworkプロジェクトをサブプロジェクトとしてMyApplicationプロジェクトに追加してください。フレームワークとテストアプリケーションの両方でココアポッドを引き続き使用できます(ただし、フレームワークプロジェクトにのみポッドを含む「共通」ライブラリを含めます)

1
Robert Fogash

1つの解決策は、use_frameworksをオンにすることです。フレームワークのPodfile内。その後、フレームワークをコンパイルし、ターゲットアプリにフレームワークを埋め込むことができます。警告メッセージが表示されなくなります(フレームワークのポッドが別のフレームワークに準拠しているというだけの理由で、これをターゲットアプリに埋め込んでいないため、アプリは独自のバイナリを参照します)。

ただし、これは次の2つの理由から適切な解決策ではありません。1。ターゲットアプリに、フレームワークに必要なポッドが含まれていることを確認する必要があります。 2.アプリはフレームワークに対して異なるポッドバージョンを使用する場合があります。フレームワークとアプリの両方が同じポッドバイナリを参照している場合、クラッシュにつながる可能性があります。

この問題には良い解決策があるとは思えません。

1
syshen

MyFrameworkを依存関係として使用して、CoolPodPodspec を作成できます。


MyFramework.podspecは次のようになります。

Pod::Spec.new do |spec|
  spec.name          = 'TestFW'
  spec.version       = '1.0.0'
  spec.license       = { :type => 'BSD' }
  spec.homepage      = 'https://github.com/user/TestFW'
  spec.authors       = { 'Auther Name' => '[email protected]' }
  spec.summary       = 'Testing FW Pod with Test App'
  spec.source        = { :git => 'https://github.com/user/TestFW.git' }
  spec.module_name   = 'TestFW'
  spec.ios.source_files   = 'TestFW/*.Swift'

  spec.dependency 'CoolPod'
end

MyApplicationpodfileは次のようになります。

target 'TestApp' do
  use_frameworks!

  pod 'CoolPod'
  pod 'TestFW'
end
0
Shahrukh Alam