NuGet 2.8 发行说明

NuGet 2.7.2 发行说明 | NuGet 2.8.1 发行说明

NuGet 2.8 已于 2014 年 1 月 29 日发布。

致谢

  1. [Llewellyn Pritchard](https://www.codeplex.com/site/users/view/leppie) (@leppie)
    • [#3466](https://nuget.codeplex.com/workitem/3466) - 对包进行打包时,验证依赖项包的 ID。
  2. [Maarten Balliauw](https://www.codeplex.com/site/users/view/maartenba) (@maartenballiauw)
    • [#2379](https://nuget.codeplex.com/workitem/2379) - 保留源凭据时删除 $metadata 后缀。
  3. [Filip De Vos](https://www.codeplex.com/site/users/view/FilipDeVos) (@foxtricks)
    • [#3538](http://nuget.codeplex.com/workitem/3538) - 支持为 nuget.exe update 命令指定项目文件。
  4. [Juan Gonzalez](https://www.codeplex.com/site/users/view/jjgonzalez)
    • [#3536](http://nuget.codeplex.com/workitem/3536) - 未通过 -IncludeReferencedProjects 传递的替换令牌。
  5. [David Poole](https://www.codeplex.com/site/users/view/Sarkie) (@Sarkie_Dave)
    • [#3677](http://nuget.codeplex.com/workitem/3677) - 修复推送大型包时引发 OutOfMemoryException 的 nuget.push。
  6. [Wouter Ouwens](https://www.codeplex.com/site/users/view/Despotes)
    • [#3666](http://nuget.codeplex.com/workitem/3666) - 修复当项目引用其他 CLI/C++ 项目时出现的目标路径不正确问题。
  7. [Adam Ralph](http://www.codeplex.com/site/users/view/adamralph) (@adamralph)
    • [#3639](https://nuget.codeplex.com/workitem/3639) - 允许默认将包安装为开发依赖项
  8. [David Fowler](https://www.codeplex.com/site/users/view/dfowler) (@davidfowl)
    • [#3717](https://nuget.codeplex.com/workitem/3717) - 删除最新补丁版本的隐式升级
  9. [Gregory Vandenbrouck](https://www.codeplex.com/site/users/view/vdbg)
    • 针对 NuGet.Server、nuget.exe mirror 命令和其他对象的多个 bug 修复和改进。
    • 此工作是在几个月内完成的,且 Gregory 和我们在正确的时机共同将其集成到适用于 2.8 版本的主数据中。

依赖项的补丁解析

解析包依赖项时,NuGet 先前已实施一种策略,即:选择满足包依赖项的最低主要和次要包版本。 但与主要版本和次要版本不同,补丁版本始终被解析为最高版本。 尽管此行为意图明显,但它为安装具有依赖项的包造成了不确定性。 请考虑以下示例:

PackageA@1.0.0 -[ >=1.0.0 ]-> PackageB@1.0.0

Developer1 installs PackageA@1.0.0: installed PackageA@1.0.0 and PackageB@1.0.0

PackageB@1.0.1 is published

Developer2 installs PackageA@1.0.0: installed PackageA@1.0.0 and PackageB@1.0.1

在此示例中,即便 Developer1 和 Developer2 都安装了 PackageA@1.0.0,但最终却出现不同版本的 PackageB。 NuGet 2.8 已更改此默认行为,以便补丁版本的依赖项解析行为与针对主要版本和次要版本的行为一致。 在以上示例中,由于安装了 PackageA@1.0.0 因此会安装 PackageB@1.0.0,而不考虑较新的补丁版本。

-DependencyVersion 开关

尽管 NuGet 2.8 更改了解析依赖项的默认行为,但它还通过包管理器控制台中的 -DependencyVersion 开关添加了对依赖项解析流程的更精确控制。 此开关允许将依赖项解析为最低版本(默认行为)、潜在的最高版本或是最高次要版本或补丁版本。 此开关仅适用于 powershell 命令中的 install-package。

DependencyVersion Switch

DependencyVersion 属性

除上文详述的 -DependencyVersion 开关之外,NuGet 还允许在 Nuget.Config 文件中设置一个新属性,从而定义默认值(如果未在 install-package 的调用中指定 -DependencyVersion 开关)。 对于任意安装包操作,NuGet 包管理器对话框也会采用此值。 若要设置此值,请将以下属性添加到 Nuget.Config 文件:

<config>
    <add key="dependencyversion" value="Highest" />
</config>

使用 -whatif 来预览 NuGet 操作

某些 NuGet 包可能具有深度依赖项图。因此,在安装、卸载或更新操作期间,它有助于先了解会发生的情况。 NuGet 2.8 将标准 PowerShell -whatif 开关添加到 install-package、uninstall-package 和 update-package 命令中,以便可视化将向其应用该命令的包的整个关闭情况。 例如,在空的 ASP.NET Web 应用程序中运行 install-package Microsoft.AspNet.WebApi -whatif 会生成以下内容。

PM> install-package Microsoft.AspNet.WebApi -whatif
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.WebHost (≥ 5.0.0)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Core (≥ 5.0.0)'.
Attempting to resolve dependency 'Microsoft.AspNet.WebApi.Client (≥ 5.0.0)'.
Attempting to resolve dependency 'Newtonsoft.Json (≥ 4.5.11)'.
Install Newtonsoft.Json 4.5.11
Install Microsoft.AspNet.WebApi.Client 5.0.0
Install Microsoft.AspNet.WebApi.Core 5.0.0
Install Microsoft.AspNet.WebApi.WebHost 5.0.0
Install Microsoft.AspNet.WebApi 5.0.0

降级包

安装预发行版本的包较为常见,以便调查新功能,然后决定回滚到上一稳定版本。 在 NuGet 2.8 之前,这是一个涉及卸载预发行包及其依赖项,然后安装旧版本的多步骤流程。 但对于 NuGet 2.8,update-package 现在会将整个包关闭(即,包的依赖项树)回滚到前一版本。

开发依赖项

许多不同类型的功能均可作为 NuGet 包来提供,包括用于优化开发流程的工具。 这些组件虽然有助于开发新包,但在后续发布时,不应将其视为新包的依赖项。 NuGet 2.8 允许包在 .nuspec 文件中将自身标识为 developmentDependency。 安装后,此元数据也会添加到向其安装包的项目的 packages.config 文件。 在 nuget.exe pack 期间,针对 NuGet 依赖项后续分析 packages.config 文件时,它将排除标记为开发依赖项的依赖项。

针对不同平台的单个 packages.config 文件

为多个目标平台开发应用程序时,通常会为每个相应的生成环境使用不同的项目文件。 慈爱,在不同项目文件中使用不同 NuGet 包也很常见,因为包对不同平台提供不同级别的支持。 NuGet 2.8 通过为特定于平台的不同项目文件创建不同 packages.config 文件,从而为此场景提供更好的支持。

Multiple package.config files

回退到本地缓存

虽然 NuGet 包通常会通过网络连接从远程库(例如 NuGet 库)进行使用,但很多情况下客户端并未进行连接。 如果没有网络连接,NuGet 客户端则无法成功安装包,即使这些包已在本地 NuGet 缓存中的客户端计算机上。 NuGet 2.8 将自动缓存回退添加到包管理器控制台。 例如,当断开网络适配器连接并安装 jQuery 时,控制台会显示以下内容:

PM> Install-Package jquery
The source at nuget.org [https://www.nuget.org/api/v2/] is unreachable. Falling back to NuGet Local Cache at C:\Users\me\AppData\Local\NuGet\Cache
Installing 'jQuery 2.0.3'.
Successfully installed 'jQuery 2.0.3'.
Adding 'jQuery 2.0.3' to WebApplication18.
Successfully added 'jQuery 2.0.3' to WebApplication18.

缓存回退功能无需任何特定命令参数。 此外,缓存回退目前仅适用于包管理器控制台,且该行为当前在包管理器对话框中无效。

WebMatrix NuGet 客户端更新

与 NuGet 2.8 一道,适用于 WebMatrix 的 NuGet 扩展也已进行更新,从而包含 NuGet 2.5 提供的众多主要功能。 新功能包括“全部更新”、“最低 NuGet 版本”等功能,并允许覆盖内容文件。

若要在 WebMatrix 3 中更新 NuGet 包管理器扩展,请执行以下操作:

  1. 打开 WebMatrix 3
  2. 单击功能区中的“扩展”图标
  3. 选择“更新”选项卡
  4. 单击以将 NuGet 包管理器更新到 2.5.0
  5. 关闭并重启 WebMatrix 3

这是 NuGet 团队首次发布针对 WebMatrix 的 NuGet 包管理器扩展。 此代码最近由 Microsoft 为开源 NuGet 项目提供。 此前,NuGet 集成会内置于 WebMatrix 中,而无法从 WebMatrix 进行带外更新。 现在,我们可将其与 NuGet 的客户端工具的其余部分一道进一步更新。

缺陷修复

其中已完成的一大 bug 修复是:提升 update-package -reinstall 命令的性能。

除这些功能和上述性能修复之外,此版本的 NuGet 还包括很多其他 bug 修复。 此版本共计解决了 181 个问题。 有关 NuGet 2.8 中已修复工作项的完整列表,请查看 [NuGet Issue Tracker for this release](https://nuget.codeplex.com/workitem/list/advanced?release=NuGet%202.8&status=all)