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,并使这些问题得到了批准和修复。

  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 开始,系统会识别这些冲突并提示是否覆盖这些文件,而以前这些文件始终被跳过。

覆盖内容文件

`nuget.exe update` 和 “Install-Package” 现在都有一个新的选项“-FileConflictAction”来为命令行场景设置一些默认值。

当目标项目中已存在来自包的文件时,请设置默认操作。 设置为“覆盖”以始终覆盖文件。 设置为“忽略”以跳过文件。 如果未指定,它将提示输入每个冲突文件。

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

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

NuGet 安装包含 \build 文件的包时,它将在项目文件中添加一个 MSBuild <Import> 元素,指向 .targets.props 文件。 .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 包来使用此功能;NuGet 包资源管理器尚不支持它。

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

许多人已经知道通过 PowerShell cmdlet "Update-Package" 来更新所有的软件包;现在也可以很简单地通过用户界面来执行更新。

若要试用此功能,请执行以下作:

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

对话框中的“全部更新”按钮

改进了对 nuget.exe Pack 的项目参考支持

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

  1. 如果引用的项目具有相应的.nuspec文件,例如在同一文件夹中有一个名为proj1.nuspec的文件和proj1.csproj,则此项目将作为依赖项添加到包中,并使用从.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 的包 A(>= 1.0.0)。
  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 请求。

来自 nuget.exe的 HTTP 输出

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

在 NuGet 2.5 之前,如果尝试基于 UNC 路径或本地文件夹运行“nuget.exe 推送”到包源,推送会失败。 使用最近添加的分层配置功能,nuget.exe 通常需要面向 UNC/文件夹源或基于 HTTP 的 NuGet 库。

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

以下命令现在将正常工作:

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

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

nuget.exe 访问配置(除了“spec”和“pack”)的命令现在支持新的“-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”文件夹不用于本机项目。