5

私はポータブル クラス ライブラリに取り組んでおり、NuGet が PCL またはプラットフォーム固有のライブラリ (存在する場合) を使用する必要があるかどうかを判断するために使用する戦略を理解したいと考えています。

さまざまなプラットフォームと移植可能なクラス ライブラリをサポートする JSON.NET を参照するサンプル プロジェクトを作成しました。JSON.NET が NuGet から提供するものは次のとおりです。

  • net20
  • net35
  • net40
  • sl3-wp
  • sl4
  • sl4-windowsphone71
  • winrt45
  • ポータブル-net40+sl4+wp7+win8

まず、NET 4.0 を対象とするライブラリを作成し、NuGet を使用して JSON.NET への参照を追加しました。net40 ライブラリへの参照を追加しました。これは、ターゲット プラットフォームが完全に一致しているためだと思います。次に、NET 4.0.3 をターゲットにしました。まだnet40バージョンが参照されていました。次に、移植性のないライブラリ間で完全に一致しない Silverlight 5 を試しました。しかし、sl4 ライブラリが選択されました。また、Windows Phone 8 をターゲットにすると、sl4-windowsphone71 ライブラリが選択されました。

そのため、ターゲット プラットフォーム用の非移植性の互換ライブラリがある場合は常に、それが優先されるようです。JSON.NET の場合、別のポータブル ライブラリによって参照されている場合にのみ PCL が選択されます。もしそうなら、私は次の状況がどのように解決されるのか当惑しています:

ライブラリ A には 2 つのバージョンがあります。

  • net40
  • ポータブル-net40+sl4+wp7+win8

ライブラリ B は A を参照し、1 つのバージョンがあります。

  • ポータブル-net40+sl4+wp7+win8

最後に、ライブラリ C は A と B の両方を参照し、1 つのバージョンを持ちます。

  • net40

C 用に解決された lib A への参照はどのようになりますか? C は A を直接参照するため、A の net40 を取得する必要があります。ただし、C は移植可能な B も参照するため、さらに A の移植可能なバージョンを取得する必要があります。その依存関係を解決します。私は正しいですか?

更新します。いくつかのテスト プロジェクトを作成しましたが、ライブラリ C に移植性のないライブラリ A への直接参照が含まれている限り、このバージョンのライブラリが優先され、A の PCL バージョンが上書きされるようです。そのようなシナリオのようです。は許可されていません - ライブラリは、別の (移植可能な) バージョンを間接的に参照している場合、移植不可能な lib を直接参照することはできません。

4

1 に答える 1

4

NuGet は、参照するライブラリのバージョンを決定するときに、"最も具体的な" または "最も狭い" 一致を使用します。

ライブラリのポータブル バージョンは、ライブラリのプラットフォーム固有のバージョンと互換性がある必要があります。これは、フレームワークの異なるバージョン間の互換性のより一般的なケースに過ぎないと考えています。この例では、net40 とポータブルを net45 と net40 に置き換えます。その場合、NuGet は依存関係の .NET 4.5 バージョンを使用する必要がありますが、.NET 4 バージョンに対してコンパイルされた別の依存関係がある場合は、実行時に代わりに .NET 4.5 バージョンがあれば動作するはずです。

互換性を保つには、ライブラリの異なるバージョンが同じ ID (名前、バージョン番号、および (該当する場合) 厳密な名前のキー) を持ち、API 互換性がある必要があります。つまり、特定のプラットフォーム用のライブラリのバージョンは、そのプラットフォームで実行できるポータブル バージョンと同じ API をすべて備えています (ただし、プラットフォーム固有のバージョンでは追加の API を追加できます)。

于 2013-02-10T23:22:15.200 に答える