次の方法で共有


PackageDownload

Visual Studio 2017 および .NET SDK 1.0.0 から、NuGet PackageReference 機能が追加されました。

PackageReference を使うと、パッケージの依存関係をプロジェクト ファイル内で直接管理できます。 復元を実行すると、推移的な依存関係が自動的に解決され、プロジェクト グラフ内のパッケージごとに適切な参照が選ばれます。

NuGet バージョン 5.3 では、.NET SDK スタイルのプロジェクト用に PackageDownload というコンパニオン機能が導入され、プロジェクトにそのファイルを含めずにパッケージをダウンロードできるようになりました。

PackageDownload の仕様

PackageDownload は、すべての .NET SDK スタイルのプロジェクトに対応するユーティリティ機能であり、PackageReference と連携して機能します。

PackageDownload 項目は、PackageReference と比較すると、異なる属性をサポートしています。 次の表に記載されている属性のみがサポートされています。

属性 説明
バージョン [] で囲まれた正確なバージョンのみがサポートされます。 複数のバージョンを指定するには、; で区切ります。 [1.0.0][1.0.0];[2.0.0]

PackageDownload を介して取得したパッケージは PackageReference を介して取得したパッケージと同じインストール処理が行われます。 つまり、パッケージの署名が検証され、パッケージのソース マッピングが考慮されます。 PackageDownload で新しく取得したすべてのパッケージは、グローバル パッケージ フォルダーにインストールされます。

機能 PackageReference PackageDownload
パッケージ資産の選択 パッケージのアセンブリは自動的にプロジェクトに追加され、コンパイルと実行時に使うことができます パッケージの資産はプロジェクトに含まれません。
依存関係 自動的に解決され、1 つのバージョンにフラット化されます まったく考慮されません
pack パッケージ仕様に含まれています パッケージ仕様に含まれていません
推移性 PackageReference 項目は、依存関係プロジェクトに自動的に反映されます PackageDownload 項目は、依存関係プロジェクトでは無視されます
バージョン 1.0.0[1.0.0, ) などのバージョン範囲がサポートされています。 バージョンは 1 つだけ指定できます。 正確なバージョンのみがサポートされています。 複数のバージョンをダウンロードできます。
dotnet list package すべての依存関係が含まれています PackageDownload のパッケージは dotnet list package で表示されません。

PackageDownload は取得以外の方法でプロジェクトに関連付けられないため、同じパッケージの複数のバージョンをダウンロードできます。

PackageDownload の制限事項

適用範囲が限定された高度な機能であることを考えると、PackageReference と同様のツールのサポートはありません。

  • PackageDownload 項目を変更する VisualStudio や dotnet.exe の機能はありません。 プロジェクト ファイル内で手動で変更する必要があります。
  • dotnet add、remove、list コマンドは PackageDownload 項目を考慮していません。
  • PackageDownload 項目はパッケージ ロック ファイルの一部では "ありません"。

PackageDownload アプリケーション

PackageDownload の主な用途は、従来の NuGet パッケージ構造に従わない、主にビルド時の依存関係を持つパッケージをダウンロードすることです。

理想的には、すべての依存関係を PackageReference を介して表現することですが、それが不可能なシナリオの場合、または、よくあることですが、まだ実用的ではない場合は、この機能を使い、プロジェクトに関連付けられていない packages.config ファイルを使って、それを達成できる同様の方法で、特定の場所へのパッケージの download を単に実行することができます。

例:


<Project Sdk="Microsoft.Build.NoTargets/1.0.80"> <!-- This is not a project we want to build. -->

    <PropertyGroup>
        <RestorePackagesPath>packages/</RestorePackagesPath> <!-- Changes the global packages folder-->
        <MSBuildProjectExtensionsPath>$(RestorePackagesPath)obj/</MSBuildProjectExtensionsPath> <!-- It's still PackageReference, so project intermediates are still created. -->
        <TargetFramework>net5.0</TargetFramework> <!-- This is not super relevant, as long as your SDK version supports it. -->
        <DisableImplicitNuGetFallbackFolder>true</DisableImplicitNuGetFallbackFolder> <!-- If a package is resolved to a fallback folder, it may not be downloaded.-->
        <AutomaticallyUseReferenceAssemblyPackages>false</AutomaticallyUseReferenceAssemblyPackages> <!-- We don't want to build this project, so we do not need the reference assemblies for the framework we chose.-->
    </PropertyGroup>

    <ItemGroup>
        <PackageDownload Include="MySpecialPackage" version="[6.0.0]" />
    </ItemGroup>

</Project>