2017-11-18 19 views
6

私はa .NET Standard projectとNuGetでうんざりしています。私は働いているプロジェクトがあり、uploaded it to NuGet.orgを持っています。私のプロジェクトは.NET標準の1.3を対象としています。should support .NET Framework 4.6と.NET Core 1.0です。.NET標準のNuGetパッケージが非常に多くの依存関係を引き起こすのはなぜですか?

しかし、新しいプロジェクト(NuGet経由で)を新しい.NET Framework 4.6プロジェクトに追加しようとすると、依存関係はパッケージに解決されました。これらはすべてシステムライブラリであり、Microsoft.NETCore.PlatformsまたはNETStandard.Library 1.6.1の依存関係のようです。 (Gist of full PM output.

私のプロジェクトでは、いくつかのライブラリ(using)しかインポートされていません。つまり、それらは.NET標準に付属するすべてのライブラリです。これらのライブラリは、以下のとおりです。

  1. システム
  2. System.Textの
  3. するSystem.Reflection
  4. System.Linqの
  5. System.Collections.Generic;

私は.NET Frameworkと.NET Coreアプリケーション間でシームレスに作業したいので、私は自分のプロジェクトターゲット.NET Standardにすることにしました。私は、Standardの全ポイントが最小レベルの互換性を設定することだと考えました。私は、おそらくSystem.ConsoleのようなライブラリがCoreやFrameworkで自動的に利用できると仮定していたと思います。

標準プロジェクトを同じソリューション内のフレームワークとコアプロジェクトの依存関係としてテストしたときに、このようなことは気付かなかったので、これがNuGetの問題である可能性があります。

ここで実際に何が起こっていますか?また、.NET標準ライブラリをNuGetで利用できるようにするにはどうすればよいでしょうか?

NuGetパッケージの指定方法に問題がありますか?あるいは私は根本的に何かを誤解したことがありますか?

+0

実際に出力フォルダに何かが追加されているのか、それともパッケージをインストールするときにそれが依存関係の恐ろしいリストになっているのか分かりませんか?私の経験はそれが後者であることです。それはまだ偉大ではありませんが、心配するものではありません。 –

+0

@JonSkeet私のパッケージフォルダには、本当に1つだけ期待していたときに、長いフォルダリストが表示されるようになりました。加えて、「NuGetパッケージを管理する」画面にはすべてのパッケージが表示されます(一部は更新が保留中です)。 –

+2

右 - binディレクトリには何がありますか? (FWIW、私はこれが非常に残念な状況だと完全に同意します。後のリリースで改善されているかどうかはわかりません。しかし、これが私が生産するいくつかのパッケージでは、net45ターゲットとnetstandard1.xバージョンを作成する理由です...) –

答えて

9

あなたは何か間違ったことは起こっていませんが、これは起こると予想されます。独自のDLLを新しい.NET Frameworkプロジェクトに追加するだけの場合は、ライブラリ用の.NET Standard 2.0をターゲットにして、.NET Frameworkのバージョンを待つ必要があります。これは、APIとアセンブリのバージョンの両方をネイティブにサポートします(.NET Framework 4.7.1はすべてのAPIをサポートしていますが、一部のアセンブリのバージョン管理方法にバグがあり、ツール(VS 2017 15.5+)がそれを修正するためにアセンブリを追加することになります)。

.NET Standardがどのように構築され、サポートされているフレームワークのサポートが実装されているかの副作用が見られます。これは、対象とする.NET Standardバージョンと、ライブラリパッケージを参照するために使用されたツールに基づいても異なります。

.NET標準<では、NETStandard.Libraryメタパッケージを参照し、追加パッケージ(System.*)を参照しています。これらのパッケージには、 ".NET Standard Contract"(APIのセットとアセンブリ名+バージョン)を構成する参照アセンブリが含まれています。

.NET Standard 1.0-1.6用に作成したNuGetパッケージをアプリケーションが参照すると、これらの個々のパッケージは参照アセンブリを持ち込まず、アプリケーションが対象とするフレームワークの実装アセンブリを取り込みます。

.NETコアの場合、これらはランタイムの一部であるアセンブリと一致します。したがって、DLLファイルはビルドされたアプリケーションの隣にありません。しかし、.NET Core 1.1(NETStandard.Libraryバージョン1.6.1)用の新しいパッケージがリリースされたときに変更されました。その結果、.NET Core 1.0用に構築されたアプリケーションでは、.NET Core 1.1に含まれるようになった新しい実装アセンブリが完成しました(幸いなことに、1.1は「長期サポート」バージョンとなりました。 LTSの約束の一部です)。

.NET Frameworkでは、これらのライブラリ(一部の例外を除き、System.Net.Httpなど)はあまり機能しません。システムアセンブリに転送するだけです。したがって、例えば、 "契約"はSystem.ObjectSystem.Runtime.dllアセンブリで定義されていることを定義します。したがって、System.Runtime.dllファイルが.NET Frameworkアプリケーションで完成すると、にはforward to .NET Frameworkのタイプmscorlib.dllが含まれています。 .NET Coreにはすでに、異なるプラットフォームの異なるSystem.Runtime.dllが含まれています。このメカニズムは、両方のプラットフォームで動作する単一のDLLファイルを可能にします。これらのタイプの転送と追加の実装は、両方の実装で動作する同じ「コントラクト」(型+アセンブリ+アセンブリバージョン)を保証します。

.NET Standard 2.0は、必要なパッケージとDLLの数を減らし、新しい.NETコアバージョンがリリースされるたびにNETStandard.Libraryに必要な更新を削除することを目的としていました。

.NET Standard 2.0および.NET Core 2.0の場合、NETStandard.Libraryパッケージはコードをコンパイルするための参照アセンブリのみをプロジェクトに持ち込みますが、NuGetパッケージはこのパッケージに依存しません。したがって、.NET Standard 2.0をターゲットとするライブラリを作成して公開すると、NuGetの依存関係はなくなります(追加しない限り)。

.NET標準ライブラリを使用するときに "サポートライブラリ"が持ち込むロジックは、ビルド中に使用されたツールに移動されました。したがって、netstandard.dllへの参照を含むライブラリが.NET Frameworkプロジェクトに追加されると、ツールは使用されている.NET Frameworkのバージョンに基づいて必要なサポートDLLを追加します。これは、.NET Framework 2.0および.NET Standard 1.5以降で実行されました。これは、.NET Framework 4.6.1がこれらの種類のDLLファイルを介して.NET Standard 2.0(以前は1.4)と遡及的に互換性があったためです。同じツールを使用すると、たとえNuGetパッケージが何らかの形でそのようなアプリケーションプロジェクトに持ち込まれたとしても、NuGetを介して取り込まれた.NET Standard実装ライブラリはすべてビルドから削除されます。したがって、.NET Core 1.0がリリースされたときにビルドされた.NET Standard 1.0 NuGetパッケージを参照すると、そのNuGetの依存関係はすべて削除され、代わりにビルドツールに付属するサポートライブラリが取得されます。アイデアはnetstandard.dllSystem.Runtime.dllなどは、.NET Frameworkの一部及び任意の.NET標準1.0-2.0 DLLファイルになるように、.NET Frameworkの4.7.1は、「受信トレイ」に必要なすべてのアセンブリが含まれているというものであった

でしょう「だけ問題は、これらの「受信ボックス」dllファイルのライブラリがロードに失敗するように、いくつかのアセンブリのバージョン番号が低すぎるということでした。これは、サポートツールとしてバージョン番号の高いDLLファイルを組み込むようにツールを変更することで修正されました。 「受信ボックス」.NET Frameworkアセンブリに転送します。これは、.NET Framework 4.7.2で修正される予定です。

+0

Martinに感謝します。この非常に包括的な答えを完全に消化するために私をしばらく時間がかかりました。私は.NET Standardがまだ幼児期にあり、これは歯が痛くなることの1つだと思います。私はしっかりと座ってフレームワークの4.7.2バージョンを待つでしょう。 –

+0

回避策に私の注意が向けられています:http://blog.tdwright.co.uk/2017/11/21/update-getting-net-standard-apps-playing-nicely-on-nuget/ –

+1

はい、NuGetのget-nearest-frameworkロジックは、他のものを考慮する前に、より低いバージョンで同じターゲットフレームワークを好む(したがって、 'net471'プロジェクトは' netstand'2より 'net35'を選択するでしょう) –

関連する問題