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