2

私は実際に、クライアントがリポジトリ サーバーからダウンロードする必要があるモジュールに依存するアプリケーションに取り組んでいます。モジュールは、jar、dll、zip などの任意のアーカイブにすることができます。

クライアントは最初に一連のプロパティ (サーバーによって既に定義されているキーと値のセット) をリポジトリ サーバーに送信します。サーバーはこれらのプロパティに基づいて計算を行い、クライアントに対応するすべてのモジュールを返します。クライアントが古いモジュールを必要とする場合、サーバーは最新のモジュールをクライアントに送信して更新できるようにします。サーバーは、モジュール間の依存関係を計算し、maven のようにクライアントに送信する必要もあります。

しかし、主な問題は、クライアントから送信されたプロパティがクライアント環境に固有であるため、それらについて推測できないことです。

私が最初に思いついたのは、各列がプロパティを表し、各行がモジュールを表すマトリックスを作成することでした。マトリックスでは、プロパティを追加および削除できます。そして、マトリックスのケースごとに、そのモジュールに対応する値を追加します。

たとえば、2 つのモジュールと一連のプロパティがあるとします{OS, Archive, Arch, Version, .Net}。module1 の場合、値は{OS="Windows 7", Archive="dll", Arch=32-bits, Version="2.0.0",.net=3.5}です。module2 の場合、値は次のとおりです。{OS="Windows 7", Archive="jar", Version="2.1",.net="4.0"}

ただし、このケースは、各プロパティに値が 1 つしか含まれていない場合に完全に機能します。module1クライアントが、Windows 7 (およびmodule2) で動作し、dll.net 3.5 の上位バージョンをサポートするアーカイブで実行されるすべてのモジュールが必要であると言った場合、. module1返されます。

それは完璧に機能します。

しかし、各プロパティに複数の値を含めることができる場合はどうなるでしょうか (これは私たちの場合です)。たとえば、前の例で、module1 が Windows 7、Vista、XP で実行できる場合。OS プロパティについては、クライアントから送信された各プロパティを調べて、正しい値を検索する必要があります。それが組み合わせ計算です。

このプロセスで見られるのは、apt や yum などのパッケージ管理システムに非常に似ています。

この問題に対するより良いアプローチは何ですか?

4

3 に答える 3

0

まず第一に、これは解決済みの問題であるという一部のコメント投稿者に同意します。時間を割ける場合は、既存のアプローチを調査してください。maven、ivy、yumm、gem、rpm、apt-get、gentoo、mac homebrew、perl cpan、cygwin、haskel cabal、python easyinstall、Java Web Start。次に、一連のアプローチに分類し、各アプローチの長所と短所をリストします。

私はそのようなシステムを実装する必要がありました.Mavenのアプローチはうまくいきました. ただし、クライアントで推移的な依存関係ツリーを決定するのは少し複雑なので、純粋な Maven は使用しませんでした。代わりに、ビルド時に maven-dependencies-plugin を使用して依存関係のリストを計算し、最上位の jar 内のプロパティ ファイルに配置しました。

次に、クライアントが何かを実行したい場合、Maven 座標が与えられ、ローカル リポジトリ内のパスが計算され、ローカルに存在しない場合はダウンロードされます。次に、jar 内のプロパティ ファイルを調べて、他の jar のリストを取得しました。次に、クライアントは存在しないものをダウンロードし、クラスパスを設定してコードを実行しました。

さて、@Dimitriに戻ります。

まず、あなたの質問からは、これを依存関係のツリーと考えていることは明らかではありません。木の観点から考えることに慣れてください。プロパティ グラフを見て、その感触をつかんでください。

また、あなたの質問は、サーバーに依存関係を計算するように依頼したのはクライアントであると示唆していましたが、通常、この計算を行うのはクライアントであり、サーバーはメタデータとバイナリを提供するだけです。

あなたは言う:

しかし、各プロパティに複数の値を含めることができる場合はどうなるでしょうか (これは私たちの場合です)。たとえば、前の例で、module1 が Windows 7、Vista、XP で実行できる場合。OS プロパティについては、クライアントから送信された各プロパティを調べて、正しい値を検索する必要があります。それが組み合わせ計算です。

確かに、クライアントは 1 つの OS しか実行しないので、OS が一致しないすべての依存関係を除外するだけですか?

複雑になるのは、バージョンの範囲を相互に一致させる必要がある場合です。理想的には、それを避けることができればより良いです。Maven はバージョン範囲をサポートしていますが、使用する必要はありませんでした。

于 2013-07-02T21:16:29.077 に答える