2016-12-06 2 views
5

現在、Androidの& iOSプラットフォームで利用可能なSDKを開発中です。Android&iOS:SDKを構築する際の依存関係の処理方法

Androidの場合、Gradleファイルの依存関係を一覧表示し、Mavenを使用してSDKを提供します(したがって、依存関係は.pomファイルに表示されます)。

iOSでは、依存関係を処理するためにココアポッドを使用しています。

問題は以下の通りです: *当社のSDKがバージョンX に依存関係を使用*当社のクライアントのひとつ別のクライアントは、バージョンZ

にまったく同じ依存関係を使用する場合があります*同じ依存関係を使用しますが、バージョンY でありますだから、

、これは潜在的に私たちのクライアントの1(そうでない場合は、両方)に破壊される私たちのSDKにつながる私たちは今のところ、それは依存関係のXで動作することを確認、しかし、YとZのではない

ので、レガシーコードを持っていますこの問題の原因となるライブラリのソースコードを単純にインポートし、同じ名前のライブラリを使用しないように名前を付けます。

私の意見では、これは妥当な解決策ではありません。最新の修正はありません。更新するのは苦痛で、クライアントはライブラリの2倍です。

今のところ、私は潜在的な良い解決策を考えようとしていますが、私がGoogleで望んでいるものを見つけることができませんでした(おそらく私は適切なキーワードを使用していません:/)。

私が考えていたのは、依存関係ごとにさまざまなバージョンのサポートを提供することでした。 「このメソッドがここにある場合はそれを実行し、それ以外の場合は以前のバージョンのメソッドを使用する」(iOSのセレクタrespondToなど)のようなビット。次に、クライアントは、サポートされている範囲内の条件で、任意のバージョンの依存関係を使用できる必要があります。

しかし、正しい方法であるかどうかわかりません。 他にも解決策はありますか?

Android用

+0

私はあなたが達成しようとしていることは可能だとは思わない。あなたが 'code'をバージョンに依存しないように変更したとしても、あなたのライブラリはそれが依存している他のライブラリについて正確に言及する必要があります。バージョンを指定しないと、最新のバージョンが想定されます(少なくともココ配備では)。依存関係の下で同じライブラリの複数のバージョンを記述することはできません。同時に使用されるようにバージョンが明示的に作成されていない限り。 – lukya

+0

しかし、あなたができることは、** base sdk **の複数のバージョンを作ることです。違いは 'dependency'バージョンだけです。あなたが言ったように**あなたは別のバージョンを作成する予定の依存関係のすべてのバージョンをサポートする**ベースコード**を変更することができます。次に、sdkのさまざまなバージョン間の唯一の違いは、依存関係の特定のバージョンを指し示すpom/podファイルになります。クライアントがあなたのsdkの正しいバージョンを選ぶために、依存バージョンのすべての組み合わせのマトリックスを維持する必要があります。 – lukya

+0

上記のアプローチでは、クライアントは計画どおりに単一のバージョンのsdkを使用することはできませんが、クライアントコード内の他の依存バージョンをサポートするバージョンを**選択するだけで**できます。 sdkはmaven/cocoapodsを介して追加されるため、sdkのバージョンを変更することは、クライアントの依存関係設定ファイル(pom/pod)の数値変更に過ぎません。その理想的ではないが、私はそれが近いと思う。 – lukya

答えて

2

:)おかげで、2つの解決策、ビルドツールベース1、および建築の1があります

1-場合は達人であなたのライブラリーを構築し、あなたが使用することができます"提供された"スコープは、ライブラリがそれを実行しているコンテナから依存関係を取得するように強制します。そうすれば、依存関係はあなたのライブラリを消費するアプリケーションによって提供されることがあります。依存関係が大きく異なる場合、これは役に立ちません。

2.レスキューへの抽象化!プロジェクトをメインライブラリとプラグインライブラリに細分することができます。メインライブラリは、すべてのクラスにメソッドを表示し、そのメソッドはアプリから呼び出すメソッドになります。メインライブラリの内部では、すべてのクラスがすべての外部SDKまたは依存関係を間接的な形式でインポートします。これは抽象クラスまたはインタフェースのいずれかになりうる包括的ラッパーです。たとえば、拡張されたFacebookのログインUIを提供しているとします。次に、facebook SDKをビューに直接参照するのではなく、facebookLoginInterfaceを参照して呼び出します。その後、セカンダリプロジェクトfacebookLogin41があります。ここでは、facebook sdk 4.1を使用してfacebookLoginInterfaceを実装し、もう一つはfacebookLogin418を実装します。ここでは、facebook sdk 4.1.8を使用して同じインターフェイスを実装します。次に、依存関係注入フレームワーク(Roboguiceプロバイダは非常に良い例です)、依存関係スコープ(例えば、提供される)などのロジックを提供して、ライブラリインスタンスをfacebookLoginInterfaceにします。最後に、クライアントはメインライブラリと必要なセカンダリプロジェクトの両方をインポートし、メインライブラリを使用します。

+0

答えがありがとう、プラグインベースのアプローチは非常に興味深いことができます。私たちは主に依存関係としてネットワークライブラリのボレーを持っているので、Androidプロジェクトでうまくいくはずです。だから我々は簡単にインターフェイスを作成し、それをプラグインとして統合することができます。 私の主な関心事は、現在iOSアプリケーションです:小さなデザインツールやコードユーティリティのようないくつかの小さなライブラリが依存しています。それぞれのための1つのプラグインは間違いなく過度に使用されます。たぶん複数のプラグインを1つにマージする必要がありますか?あなたはそれについて考えていますか? –

+0

依存関係を保持している限り(同じ競合する依存関係を消費するプラグインをマージする)、プラグインをマージするとうまくいくでしょう。 –

関連する問題