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 更新命令指定项目文件。
  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) - 修复 nuget.push 在推送大型包时出现的 OutOfMemoryException。
  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 镜像命令及其他组件进行了多个漏洞修复和功能改进。
    • 这项工作持续了几个月,格雷戈里与我们合作,选择合适的时机将工作集成到 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

在此示例中,安装了 PackageA@1.0.0 的 Developer1 和 Developer2 最终每个人都安装了不同版本的 PackageB。 NuGet 2.8 更改此默认行为,使修补程序版本的依赖项解析行为与主要版本和次要版本的行为一致。 在上面的示例中,将安装 PackageB@1.0.0,因为安装 PackageA@1.0.0,无论是否存在较新的修补程序版本。

-DependencyVersion 开关

尽管 NuGet 2.8 更改了解析依赖项 的默认 行为,但它还通过包管理器控制台中的 -DependencyVersion 开关对依赖项解析过程添加了更精确的控制。 该开关允许将依赖项解析为最低版本(默认行为)、最高可能的版本或最高次要版本或修补程序版本。 此开关仅适用于 PowerShell 命令中的 Install-Package。

DependencyVersion 开关

DependencyVersion 属性

除了上面详述的 -DependencyVersion 开关外,NuGet 还允许在 Nuget.Config 文件中设置一个新属性,定义默认值(如果未在调用安装包中指定 -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 时,更新包现在会将整个包关闭(例如包的依赖项树)回滚到以前的版本。

开发依赖项

许多不同类型的功能都可以作为 NuGet 包提供,包括用于优化开发过程的工具。 这些组件虽然有助于开发新包,但在以后发布时,不应将其视为新包的依赖项。 NuGet 2.8 使包能够在.nuspec文件中将其标识为开发依赖项。 安装此软件包后,该元数据也会添加到其安装所在项目的packages.config文件中。 在稍后分析 nuget.exe pack 期间针对 NuGet 依赖关系检查文件 packages.config 时,将会排除那些标记为开发依赖关系的依赖项。

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

为多个目标平台开发应用程序时,对于每个相应的生成环境,通常有不同的项目文件。 在不同的项目文件中使用不同的 NuGet 包也是常见的,因为包对不同平台的支持级别不同。 NuGet 2.8 通过为不同平台的项目文件创建不同的 packages.config 文件来改进对该方案的支持。

多个 package.config 文件

回退到本地缓存

虽然 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 修复之一是更新包 -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)