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