PackageDownload

从 Visual Studio 2017 和 .NET SDK 1.0.0 开始,添加了 NuGet PackageReference 功能。

通过 PackageReference,可直接在项目文件中管理包依赖关系。 在运行还原时,将自动解析传递依赖关系,并为项目图中的每个包选择合适的引用。

NuGet 5.3 版本中,为称作 PackageDownload.NET SDK 样式项目引入了一个伴随功能。通过它,无需将包文件添加在项目中即可下载包。

PackageDownload 规范

PackageDownload 是适用于所有 .NET SDK 样式项目的一项实用工具功能,它可与 PackageReference 协同工作。

PackageReference 相比,PackageDownload 项支持不同的属性。 仅支持下表中列出的属性。

特性 说明 示例
版本 仅支持用 [] 括起来的精确版本。 可指定多个版本,用 ; 分隔 [1.0.0][1.0.0];[2.0.0]

通过 PackageDownload 获取的包将与通过 PackageReference 获取的包经历相同的安装过程。 这意味着将验证包签名,考虑包源映射。 所有新获取的 PackageDownload 包都将安装在“全局包”文件夹中。

功能 PackageReference PackageDownload
包资产选择 包中的程序集会自动添加到项目中,并且可用于编译和运行时 项目中未包含包中的任何资产。
依赖项 自动解析并平展到单个版本 根本不考虑
打包 包含在包规范中 未包含在包规范中。
传递性 PackageReference 项自动传播到依赖项目 依赖项目会忽略 PackageDownload 项
版本 支持 1.0.0[1.0.0, ) 等版本范围。 仅允许 1 个版本。 仅支持一个精确版本。 可下载多个版本。
dotnet list package 包括所有依赖关系 dotnet list package 不显示 PackageDownload 包。

由于 PackageDownload 在获取后不以任何方式与项目绑定,因此可下载相同包的多个版本。

PackageDownload 限制

由于这是一项功能受限的高级功能,因此没有与 PackageReference 等效的工具支持。

  • 没有 VisualStudio 或 dotnet.exe 功能来修改 PackageDownload 项。 只能在项目文件中手动更改它们。
  • 不考虑对 PackageDownload 项使用 dotnet add、remove 和 list 命令。
  • PackageDownload 项目不是包锁定文件的一部分。

PackageDownload 应用

PackageDownload 的主要应用是下载不采用传统 NuGet 包结构且主要带有生成时依赖关系的包。

理想情况下,所有依赖关系都通过 PackageReference 来表示,但在无法做到这一点,或者此做法通常不可行的情况下,可使用此功能来仅将包下载 (download) 到某个位置,下载方式与未绑定到项目的 packages.config 文件所能实现的方式类似。

示例:


<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>