软件包下载

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

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

NuGet 版本 5.3 中,引入了一项针对.NET SDK 样式项目的配套功能PackageDownload,这使你可以下载包,而无需在项目中包括其文件。

软件包下载规范

PackageDownload 是所有 .NET SDK 风格项目的一个实用工具功能,它与 PackageReference 携手合作。

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

特性 Description Example
版本 仅支持括在一起 [] 的确切版本。 可以通过 ; 分隔指定多个版本。 [1.0.0][1.0.0];[2.0.0]

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

功能 / 特点 PackageReference 软件包下载
软件包资源选择 包中的程序集会自动添加到项目中,可用于编译和运行时 项目中不包含包中的资产。
依赖关系 自动解决并合并压缩到单个版本 根本不考虑
pack 包含在包规范中 包规范中未包含。
传递性 PackageReference 项目自动传播到依赖项目中 依赖项目会忽略 PackageDownload 项目中的项
版本 版本范围(如 1.0.0[1.0.0, ) 受支持)。 只允许 1 个版本。 仅支持确切的版本。 可以下载 1 个以上的版本。
dotnet list package 包括所有依赖项 "PackageDownload 包不被dotnet list package显示。"

由于 PackageDownload 未在获取之外的任何方式绑定到项目,因此可以下载同一包的多个版本。

PackageDownload 限制

鉴于这是一项具有有限适用性的高级功能,因此它没有等效于 PackageReference 的工具支持。

  • 没有 VisualStudio 或 dotnet.exe 功能来修改 PackageDownload 项。 只能在项目文件中手动更改它们。
  • dotnet add、remove 和 list 命令不考虑 PackageDownload 项。
  • 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>