6

私は iOS ライブラリ (SDK) を作成しており、JSON デコードのサポートが必要です。選択肢はたくさんありますが、問題は上流での衝突です。

たとえば、JSONKit を自分のライブラリに追加し、別のサード パーティのライブラリが同じことを行うと、自分のライブラリと他のライブラリの両方を使用したいアップストリーム ユーザーが衝突を経験します。

衝突のリスクがあるため、サードパーティのライブラリを自分のライブラリに追加することは不可能であるように見えます。上流の開発者に衝突を起こさずに iOS ライブラリを自分の依存関係として使用するにはどうすればよいですか?

4

3 に答える 3

2

上流の開発者に衝突を起こさずに iOS ライブラリを自分の依存関係として使用するにはどうすればよいですか?

そのサードパーティ ライブラリがライブラリの依存関係であることを指定し、プロジェクトへの適切なリンクと、必要な指示、バージョン情報などを提供するだけです。

そのパッケージ/ディストリビューションが配布に適していない場合 (たとえば、ソース ファイルが山ほどある場合など)、適切な静的ライブラリ ターゲットを含むパブリック プロジェクト (フォーク) を作成します。

于 2012-09-19T07:27:35.337 に答える
1

これと同じ問題が発生しています。これを解決する方法についての私の考えは次のとおりです (おそらく、強力な解決策を一緒に考え出すことができます)。バージョン管理には、Git を使用しています。

  • 1 つのオプションは、ライブラリ内のすべてのクラスに独自の識別子をプレフィックスとして付けることです。そのような場合、クラスが JSONKit の一部であっても、独自の識別子 (「JG」) を前に付けて、クラス名「JGJSONKit.h」を取得します。この方法では、衝突が発生する可能性ははるかに低くなります。

    この方法には、サードパーティのリポジトリ (JSONKit など) を更新する必要があるという欠点がありますが、これらの変更をライブラリのバージョンの JSONKit に取り込むのはより困難です。

    ただし、このコードが静的ライブラリとしてエクスポートされることを意図している場合は、これは許容される可能性があります (コードを完全に制御でき、変更をサード パーティのリポジトリに手動でプルして適切に名前を変更できるため)。 、将来の静的ライブラリの更新でそのようにすることを選択する必要がある場合)。

  • 私が検討した別のオプションは、Git サブモジュールを使用することです。このソリューションは、ライブラリがオープン ソースである場合 (または、少なくともそれにアクセスできる開発者にオープン ソースであり、公開されている必要はありません) の方が優れているようです。そのような場合、開発者は、自分のプロジェクト内で既に使用しているサブモジュールを単純に含めないことを選択できます。

アイデア?

編集:

私たちが思いついた解決策は次のとおりです。

1) このチュートリアルに従って、共有コード (サードパーティではなく、私たちが作成したもの) を静的ライブラリ ターゲットと共有リソース (xibs と画像) を含むプロジェクトにカプセル化しました。

https://github.com/jverkoey/iOS-Framework

2) 上記の静的ライブラリとバンドルを含む Git リポジトリを作成しました。

3) 必要なすべてのサードパーティ ライブラリをフォークし (必要に応じてそれらに変更を加えることができるように)、元のリポジトリをフォークされた各リポジトリ内の別のリモートとして追加しました (そのため、アップストリームで変更が行われた場合は、それらを独自のライブラリに簡単にプルできます)。フォーク)

4) -objcを「その他のリンカー」フラグ (重要) に追加して、実行時にすべてのカテゴリが正しく機能するようにしました。

全体として、ソリューションは私たちにとってほぼ完璧です。

サード パーティのライブラリを非表示にする (パブリック ヘッダーには含めず、代わりにプライベートにする) ことで競合を回避するか、それらのライブラリはプロジェクト内で公開されているヘッダーに使用され、開発者はそれらを再度追加しないように警告します (彼らは使用できます)。代わりに、すでに含まれているコードであり、前述の Git サブモジュール メソッドを介してそれらを含めるという単純さによって最新の状態に保たれます)

これがあなたの努力にも役立つことを願っています!

于 2012-09-18T18:57:05.393 に答える
0

JSONKit を調べたところ、これは静的ライブラリではなく、プロジェクトにコピーする src ファイルであることがわかりました。

プロジェクト内のすべてのクラスなどには、インターネットからコピーして貼り付けるクラスを含め、グローバルに一意の 2 文字のプレフィックスを (せき) 付ける必要があります。

JSONKit がライブラリである場合は、より良い結果が得られます。あなたのライブラリはJSONKitに依存しますが、JSONKitを含んでいません.JSONKitも含まれてリンクされていることを確認するのは、あなたのライブラリでアプリを構築する人次第です-衝突はありません(他のサードパーティに依存するライブラリを配布していますがあなたのものではないライブラリを配布することは、本質的にやや注意が必要です)。

他の人がこの JSONKit ファイルを自分のライブラリに貼り付けて配布している場合、選択肢は 2 つだけです*

JSONKit.h と .m を変更して、すべてのシンボルのプレフィックスを付ける (ソースとして含めるすべてのコードでこれを行う必要があります) か、別のもの (NSJSONSerialization?) を選択します。

これは、サード パーティのライブラリの依存関係を持つことができない (またはそうすることは危険である) という意味ではなく、ソース ファイルをプロジェクトにコピーすることは、ライブラリの依存関係を追加することと同じではないということです。

*うーん、わかりました 3.. JSONKit からすべてのシンボルを弱リンクし、JSONKit.m を提供するライブラリ ユーザーに任せることができますが、それでも問題は他のライブラリです..

TLDR .. JSONKit は避けてください。配布したいラ​​イブラリで「そのまま」使用するのは適していません。

于 2012-09-18T22:02:53.407 に答える