NuGet 2.5 发行说明

NuGet 2.2.1 发行说明 | NuGet 2.6 发行说明

NuGet 2.5 已于 2013 年 4 月 25 日发布。 由于此版本过大,因此我们认为不得不跳过版本 2.3 和 2.4! 到目前为止,这是我们为 NuGet 发布的最大版本,其中包含超过 [160 work items](https://nuget.codeplex.com/workitem/list/advanced?release=NuGet%202.5&status=all)

致谢

我们想感谢以下外部参与者对 NuGet 2.5 做出的重大贡献:

  1. [Daniel Plaisted](https://www.codeplex.com/site/users/view/dsplaisted) (@dsplaisted)
    • [#2847](https://nuget.codeplex.com/workitem/2847) - 将 MonoAndroid、MonoTouch 和 MonoMac 添加到已知目标框架标识符列表中。
  2. [Andres G. Aragoneses](https://www.codeplex.com/site/users/view/knocte) (@knocte)
    • [#2865](https://nuget.codeplex.com/workitem/2865) - 修复针对区分大小写的 OS 的 NuGet.targets 拼写问题
  3. [David Fowler](https://www.codeplex.com/site/users/view/dfowler) (@davidfowl)
    • 在 Mono 上实现解决方案生成。
  4. [Andrew Theken](https://www.codeplex.com/site/users/view/atheken) (@atheken)
    • 修复 Mono 上的单元测试失败。
  5. [Olivier Dagenais](https://www.codeplex.com/site/users/view/OliIsCool) (@OliIsCool)
    • [#2920](https://nuget.codeplex.com/workitem/2920) - nuget.exe pack 命令未将“属性”传播到 MSBuild
  6. [Miroslav Bajtos](https://www.codeplex.com/site/users/view/MiroslavBajtos) (@bajtos)
    • [#1511](https://nuget.codeplex.com/workitem/1511) - 已修改 XML 处理代码以保留格式设置功能。
  7. [Adam Ralph](http://www.codeplex.com/site/users/view/adamralph) (@adamralph)
    • 已向自定义词典添加已识别的字词,从而使 build.cmd 成功完成。
  8. [Bruno Roggeri](https://www.codeplex.com/site/users/view/broggeri)
    • 修复在本地化 VS 中运行时出现的单元测试。
  9. [Gareth Evans](https://www.codeplex.com/site/users/view/garethevans)
    • 已从 PackageService 提取接口
  10. [Maxime Brugidou](https://www.codeplex.com/site/users/view/brugidou) (@brugidou)
    • [#936](https://nuget.codeplex.com/workitem/936) - 打包时处理项目依赖项
  11. [Xavier Decoster](https://www.codeplex.com/site/users/view/XavierDecoster) (@XavierDecoster)
    • [#2991](https://nuget.codeplex.com/workitem/2991)[#3164](https://nuget.codeplex.com/workitem/3164) - 在 nuget.cofig 文件中存储包源凭据时,支持明文密码
  12. [James Manning](http://www.codeplex.com/site/users/view/jmanning) (@manningj)
    • [#3190](http://nuget.codeplex.com/workitem/3190)[#3191](https://nuget.codeplex.com/workitem/3191) - 修复 Get-Package 帮助说明

我们还想感谢以下个人查找 NuGet 2.5 Beta/RC 中的 bug,而这些 bug 已在最终发布之前获得批准并修复:

  1. [Tony Wall](https://www.codeplex.com/site/users/view/CodeChief) (@CodeChief)
    • [#3200](https://nuget.codeplex.com/workitem/3200) - MSTest 与最新的 NuGet 2.4 和 2.5 内部版本中断

此版本中值得注意的功能

允许用户覆盖已存在的内容文件

一直以来,请求最多的功能之一是:当内容文件包含在 NuGet 包中时,能覆盖已存在于磁盘上的内容文件。 从 NuGet 2.5 开始,系统会识别这些冲突并提示覆盖这些文件,而此前始终会跳过这些文件。

Overwrite content files

“nuget.exe update”和“Install-Package”现在均有一个新选项“-FileConflictAction”,它可用于为命令行场景设置默认值。

设置当目标项目中已存在来自包的某一文件时的默认操作。 设为“Overwrite”可始终覆盖文件。 设为“Ignore”可跳过文件。 如果未指定,则会为每个冲突的文件进行提示。

自动导入 MSBuild 目标和属性文件

现已在 NuGet 包的顶层创建新的传统文件夹。 作为 \lib\content\tools 的对等方,现可在包中包含 \build 文件夹。 在此文件夹中,可放置两个采用固定名称的文件:{packageid}.targets{packageid}.props。 这两个文件可直接位于 build 中,也可位于特定于框架的文件夹中,就像其他文件夹一样。 用于选取最佳匹配框架文件夹的规则与在这些文件夹中进行选取完全相同。

当 NuGet 使用 \build 文件安装包时,它会在指向 .targets.props文件的项目文件中添加 MSBuild <Import> 元素。 .props 文件将添加到顶部,而 .targets 文件将添加到底部。

使用 <References/> 元素为每个平台指定不同引用

在 2.5 版本之前,在 .nuspec 文件中,用户只能指定要为所有框架添加的引用文件。 现在,借助 2.5 版本中的此功能,用户可为每个受支持的平台分别创作 <reference/> 元素,例如:

<references>
    <group targetFramework="net45">
        <reference file="a.dll" />
    </group>
    <group targetFramework="netcore45">
        <reference file="b.dll" />
    </group>
    <group>
        <reference file="c.dll" />
    </group>
</references>

下方演示了 NuGet 如何基于 .nuspec 文件来添加项目的引用:

  1. 查找适合目标框架的 lib文件夹,并从该文件夹获取程序集列表
  2. 单独查找适合目标框架的引用组,并从该组获取程序集列表。 没有指定目标框架的引用组为回退组。
  3. 查找这两个列表的交集,并将其用作待添加的引用

此新功能允许包作者使用引用功能将程序集子集应用于不同框架,否则他们需在多个 lib 文件夹中携带重复的程序集。

注意:目前,必须使用 nuget.exe pack 来使用此功能,而 NuGet 包资源管理器尚不支持此功能。

使用“全部更新”按钮,从而允许同时更新所有包

很多人都知道用于更新所有包的“Update-Package”PowerShell cmdlet;现在,还有一种简易方法可通过 UI 来实现此操作。

若要试用此功能,请:

  1. 新建 ASP.NET MVC 应用程序
  2. 启动“管理 NuGet 包”对话框
  3. 选择“更新”
  4. 单击“全部更新”按钮

Update All button in the dialog

已改进对 nuget.exe pack 的项目引用支持

现在,nuget.exe pack 命令使用以下规则来处理引用的项目:

  1. 如果引用的项目具有相应的 .nuspec 文件(即,在 proj1.csproj 所在文件夹中存在名为 proj1.nuspec 的文件),则此项目将作为依赖项添加到包中,并使用从 .nuspec 文件读取的 ID 和版本。
  2. 否则,所引用项目的文件将捆绑到包中。 然后,此项目引用的项目将以递归方式通过相同规则进行处理。
  3. 所有 DLL、.pdb.exe 文件均会添加。
  4. 所有其他内容文件均会添加。
  5. 所有依赖项均会合并。

这样,如果存在 .nuspec 文件,则会将引用的项目视为依赖项,否则它将成为包的一部分。

有关更多详细信息,请访问此处:[http://nuget.codeplex.com/workitem/936](http://nuget.codeplex.com/workitem/936)

将“最低 NuGet 版本”属性添加到包

名为“minClientVersion”的新元数据属性现在可指示使用包所需的最低 NuGet 客户端版本。

此功能可帮助包作者指定仅在特定版本的 NuGet 之后才有效的包。 由于在 NuGet 2.5 之后添加了新的 .nuspec 功能,因此包可声明最低 NuGet 版本。

<metadata minClientVersion="2.6">

如果用户已安装 NuGet 2.5,并将包标识为需要 2.6 版本,则会向用户提供视觉提示,从而指示该包不可安装。 然后,将引导用户更新其 NuGet 版本。

这样,便可改善现有体验的以下问题:包开始安装,但随后失败并指示“发现无法识别的架构版本”。

包安装期间不再不必要地更新依赖项

在 NuGet 2.5 之前,当安装依赖于项目中已安装的某一包的包时,即使现有版本满足依赖项,依赖项也会作为新安装的一部分进行更新。

从 NuGet 2.5 开始,如果已满足依赖项版本,依赖项则不会在其他包安装期间进行更新。

场景:

  1. 源存储库包含版本为 1.0.0 和 1.0.2 的包 B。 它还包含依赖于 B (>= 1.0.0) 的包 A。
  2. 假设当前项目已安装包 B 版本 1.0.0。 现在,你想安装包 A。

在 NuGet 2.2 及先前版本中:

  • 安装包 A 时,NuGet 会自动将 B 更新到 1.0.2,即使现有版本 1.0.0 已满足依赖项版本约束,即 >= 1.0.0。

在 NuGet 2.5 及以上版本中:

  • NuGet 将不再更新 B,因为它检测到现有版本 1.0.0 已满足依赖项版本约束。

有关此更改的更多背景信息,请阅读详细的 [work item](https://nuget.codeplex.com/workitem/1681) 以及相关的 [discussion thread](https://nuget.codeplex.com/discussions/436712)

nuget.exe 输出具有详尽详细程度的 HTTP 请求

如果要对 nuget.exe 进行故障排除,或只是好奇在操作期间发出了哪些 HTTP 请求,“-verbosity detailed”开关现在便可输出所有已发出的 HTTP 请求。

HTTP output from nuget.exe

nuget.exe push 现在支持 UNC 和文件夹源

在 NuGet 2.5 之前,如果尝试基于 UNC 路径或本地文件夹来运行针对包源的“nuget.exe push”,此推送操作则会失败。 借助最近添加的分层配置功能,nuget.exe 必须面向 UNC/文件夹源或基于 HTTP 的 NuGet 库已成为一项常规设置。

从 NuGet 2.5 开始,如果 nuget.exe 标识了 UNC/文件夹源,它则会执行将文件复制到源的操作。

现在,以下命令将起作用:

nuget push -source \\mycompany\repo\ mypackage.1.0.0.nupkg

nuget.exe 支持显式指定的配置文件

访问配置(除“spec”和“pack”之外的所有配置)的 nuget.exe 命令现在支持新的“-ConfigFile”选项。该选项会强制使用特定的配置文件来代替 %AppData%\nuget\Nuget.Config 中的默认配置文件。

示例:

nuget sources add -name test -source http://test -ConfigFile C:\test\.nuget\Nuget.Config

支持本机项目

借助 NuGet 2.5,NuGet 工具现可用于 Visual Studio 中的本机项目。 我们预计大多数本机包将使用以上 MSBuild 导入功能(借助 CoApp 项目创建的工具)。 有关详细信息,请阅读 coapp.org 网站上有关此工具的详细信息

将包安装到本机项目时,会为包引入“本机”目标框架名称,以便包含 \build、\content 和 \tools 中的文件。 “lib”文件夹不会用于本机项目。