NuGet 2.1 发行说明

NuGet 2.0 发行说明 | NuGet 2.2 发行说明

NuGet 2.1 已于 2012 年 10 月 4 日发布。

分层 Nuget.Config

NuGet 2.1 支持更灵活地控制 NuGet 设置,具体方法是:以递归方式浏览用于查找 NuGet.Config 文件的文件夹结构,然后通过所有已找到文件的集合来生成配置。 例如,假设团队具有内部包存储库,它可用于对其他内部依赖项进行 CI 生成。 单个项目的文件夹结构可能如下所示:

C:\
C:\myteam\
C:\myteam\solution1
C:\myteam\solution1\project1

此外,如果为解决方案启用了包还原,则还会存在以下文件夹:

C:\myteam\solution1\.nuget

为使团队的内部包存储库可用于团队处理的所有项目,同时不使其可用于计算机上的每个项目,则可创建新的 Nuget.Config 文件并将其放置在 c:\myteam 文件夹中。 无法为每个项目指定包文件夹。

<configuration>
    <packageSources>
    <add key="Official project team source" value="http://teamserver/api/v2/" />
    </packageSources>
    <disabledPackageSources />
    <activePackageSource>
    <add key="Official project team source" value="http://teamserver/api/v2/" />
    </activePackageSource>
</configuration>

现在,我们可看到源是通过从 c:\myteam 下的任意文件夹运行“nuget.exe sources”命令来添加的,如下所示:

Package sources from parent nuget config

系统会按以下顺序搜索 NuGet.Config 文件:

  1. .nuget\Nuget.Config
  2. 从项目文件夹到根进行递归查找
  3. 全局 Nuget.Config (%appdata%\NuGet\Nuget.Config)

随后,这些配置会按相反顺序进行应用;这意味着,根据以上顺序,首先会应用全局 Nuget.Config,然后会从根到项目文件夹应用已发现的 Nuget.Config 文件,再接着是 .nuget\Nuget.Config。 如果使用 <clear/> 元素从配置中删除一组项目,这一点尤其重要。

指定“packages”文件夹位置

过去,NuGet 会从解决方案根文件夹下找到的已知“packages”文件夹管理解决方案的包。 对于拥有已安装 NuGet 包的众多解决方案的开发团队,这可能会导致在文件系统上的多个位置安装同一包。

NuGet 2.1 通过 NuGet.Config 文件中的 repositoryPath 元素更精细地控制包文件夹的位置。 基于先前的分层 Nuget.Config 支持示例,假设我们想让 C:\myteam\ 下的所有项目共享同一包文件夹。 为此,只需将以下条目添加到 c:\myteam\Nuget.Config

<configuration>
    <config>
    <add key="repositoryPath" value="C:\myteam\teampackages" />
    </config>
    ...
</configuration>

在此示例中,无论深度如何,共享的 Nuget.Config 文件均会为在 C:\myteam 下创建的每个项目指定一个共享包文件夹。 请注意,如果解决方案根目录下存在现有包文件夹,则需先将其删除,然后 NuGet 才会在新位置放置包。

支持可移植库

可移植库是 .NET 4 首先引入的一项功能,它允许生成可在不同 Microsoft 平台上正常运行的程序集;其范围涵盖从各版本的 .NET Framework 到 Silverlight 再到 Windows Phone,甚至还有 Xbox 360(虽然目前 NuGet 尚不支持 Xbox 可移植库目标)。 通过针对扩展框架版本和配置文件的包约定,NuGet 2.1 现通过允许创建包含复合框架和配置文件目标 lib 文件夹的包,从而支持可移植库。

例如,请考虑以下可移植类库的可用目标平台。

Portable library creation dialog

生成库并运行命令 nuget.exe pack MyPortableProject.csproj 后,可通过检查所生成 NuGet 包的内容来查看新的可移植库包文件夹结构。

Portable library package layout

如你所见,可移植库文件夹名称约定遵循“portable-{framework 1}+{framework n}”模式;其中,框架标识符遵循现有框架名称和版本约定。 现已在用于 Windows Phone 的框架标识符中找到针对名称和版本约定的一个例外情况。 此名字对象应使用框架名称“wp”(wp7、wp71 或 wp8)。 例如,使用“silverlight-wp7”会导致错误。

安装从此文件夹结构创建的包时,NuGet 现可将其框架和配置文件规则应用于多个目标,如文件夹名称中指定的那样。 NuGet 匹配规则背后的原则为:“更为具体”的目标优先于“不太具体”的目标。 这意味着,如果特定平台与项目兼容,则面向特定平台的名字对象将始终优先于可移植目标。 此外,如果多个可移植目标与项目兼容,NuGet 将首选所支持的平台集“最接近”引用包的项目的那个目标。

面向 Windows 8 和 Windows Phone 8 项目

除添加对面向可移植库项目的支持外,NuGet 2.1 还为 Windows 8 应用商店和 Windows Phone 8 项目提供新的框架名字对象,以及针对 Windows 应用商店和 Windows Phone 项目的全新常规名字对象,而这些对象在各平台的未来版本中更易于管理。

对于 Windows 8 应用商店应用程序,这些标识符如下所示:

NuGet 2.0 及先前版本 NuGet 2.1
winRT45,.NETCore45 Windows,Windows8,win,win8

对于 Windows Phone 项目,这些标识符如下所示:
Phone OS NuGet 2.0 及先前版本 NuGet 2.1
Windows Phone 7 silverlight3-wp wp,wp7,WindowsPhone,WindowsPhone7
Windows Phone 7.5 (Mango) silverlight4-wp71 wp71,WindowsPhone71
Windows Phone 8 (不支持) wp8,WindowsPhone8

在上述所有更改中,NuGet 2.1 将继续完全支持旧框架名称。 今后,应使用新名称,因为它们在各平台的未来版本中将更为稳定。 但是,这些新名称在 2.1 版本之前的 NuGet 版本中不受支持,因此请相应规划何时进行切换。

已改进包管理器对话框中的搜索

在过去几次迭代中,NuGet 库已引入更改,从而大大提高包搜索的速度和相关性。 但是,这些改进仅限于 nuget.org 网站。 NuGet 2.1 通过 NuGet 包管理器对话框提供改进的搜索体验。 例如,假设你想找到 Windows Azure 缓存预览版包。 针对此包的合理搜索查询可能为“Azure 缓存”。 在先前版本的包管理器对话框中,所需包甚至不会在结果的第一页上列出。 但在 NuGet 2.1 中,所需包现在会显示在搜索结果顶部。

Package manager dialog search

强制包更新

在 NuGet 2.1 之前,NuGet 会在版本号不高时跳过更新包操作。 这为某些场景带来了摩擦,尤其是在生成或 CI 场景中。在这些场景中,团队不想随每次生成递增包版本号。 所需行为是:无论何种情况均强制更新。 NuGet 2.1 使用“重新安装”标志解决了此问题。 例如,在尝试更新没有较新包版本的包时,先前版本的 NuGet 会导致以下问题:

PM> Update-Package Moq
No updates available for 'Moq' in project 'MySolution.MyConsole'.

通过使用“重新安装”标志,无论是否有较新版本,都会更新包。

PM> Update-Package Moq -Reinstall
Successfully removed 'Moq 4.0.10827' from MySolution.MyConsole.
Successfully uninstalled 'Moq 4.0.10827'.
Successfully installed 'Moq 4.0.10827'.
Successfully added 'Moq 4.0.10827' to MySolution.MyConsole.

证明“重新安装”标志有益的另一场景是框架重新定位。 更改项目的目标框架(例如,从 .NET 4 更改为 .NET 4.5)时,Update-Package -Reinstall 可更新对项目中已安装所有 NuGet 包的正确程序集的引用。

在 Visual Studio 中编辑包源

在先前版本的 NuGet 中,在 Visual Studio 选项对话框中更新包源需删除并重新添加包源。 NuGet 2.1 通过支持将更新用作配置用户界面的一流函数,从而改进此工作流。

Package manager configuration dialog

缺陷修复

NuGet 2.1 包含众多 bug 修复。 有关 NuGet 2.0 中已修复工作项的完整列表,请查看 [NuGet Issue Tracker for this release](http://nuget.codeplex.com/workitem/list/advanced?keyword=&status=Fixed&type=All&priority=All&release=NuGet%202.1&assignedTo=All&component=All&sortField=LastUpdatedDate&sortDirection=Descending&page=0)