NuGet 2.7 发行说明

NuGet 2.6.1 for WebMatrix 发行说明 | NuGet 2.7.1 发行说明

NuGet 2.7 已于 2013 年 8 月 22 日发布。

致谢

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

  1. [Mike Roth](http://www.codeplex.com/site/users/view/mxrss) (@mxrss)
    • 详细说明“列出包和详细程度时显示许可证 URL”。
  2. [Adam Ralph](http://www.codeplex.com/site/users/view/adamralph) (@adamralph)
    • [#1956](http://nuget.codeplex.com/workitem/1956) - 向 packages.config 添加 developmentDependency 属性,并在 pack 命令中将其用于仅包含运行时包
  3. [Rafael Nicoletti](http://www.codeplex.com/site/users/view/tkrafael) (@tkrafael)
    • 避免在 nuget.exe pack 命令中出现重复的“Properties”键。
  4. [Ben Phegan](http://www.codeplex.com/site/users/view/benphegan) (@BenPhegan)
    • [#2610](http://nuget.codeplex.com/workitem/2610) - 将计算机缓存大小增加到 200。
  5. [Slava Trenogin](http://www.codeplex.com/site/users/view/derigel) (@derigel)
    • [#3217](http://nuget.codeplex.com/workitem/3217) - 修复在错误的选项卡中显示更新的 NuGet 对话框
    • 修复 Project.TargetFramework 在 ProjectManager 中可为 null 的问题
    • [#3248](http://nuget.codeplex.com/workitem/3248) - 修复 SharedPackageRepository FindPackage/FindPackagesById 在不存在的 packageId 上失败的问题
  6. [Kevin Boyle](http://www.codeplex.com/site/users/view/KevinBoyleRG) (@kevfromireland)
    • [#3234](http://nuget.codeplex.com/workitem/3234) - 启用对 Nomad 项目的支持
  7. [Corin Blaikie](http://www.codeplex.com/site/users/view/corinblaikie) (@corinblaikie)
    • [#3252](http://nuget.codeplex.com/workitem/3252) - 修复文件不存在时 push 命令失败并显示退出代码 0 的问题。
  8. [Martin Veselý](http://www.codeplex.com/site/users/view/veselkamartin)
    • [#3226](http://nuget.codeplex.com/workitem/3226) - 修复当项目引用数据库项目时有关 Add-BindingRedirect 命令的 bug。
  9. [Miroslav Bajtos](http://www.codeplex.com/site/users/view/miroslavbajtos) (@bajtos)
    • [#2891](http://nuget.codeplex.com/workitem/2891)- 修复 nuget.pack 错误分析“exclude”属性中通配符的 bug。
  10. [Justin Dearing](http://www.codeplex.com/site/users/view/zippy1981) (@zippy1981)
    • [#3307](http://nuget.codeplex.com/workitem/3307) - 修复 NuGet.targets 在还原包时未将 $(Platform) 传递给 nuget.exe 的 bug。
  11. [Brian Federici](http://www.codeplex.com/site/users/view/benerdin)
    • [#3294](http://nuget.codeplex.com/workitem/3294) - 修复 nuget.exe package 命令中的 bug;该命令允许添加具有相同名称但不同大小写的文件,从而最终导致出现“项目已存在”异常。
  12. [Daniel Cazzulino](http://www.codeplex.com/site/users/view/dcazzulino) (@kzu)
    • [#2990](http://nuget.codeplex.com/workitem/2990) - 将 Version 属性添加到 NetPortableProfile 类。
  13. [David Simner](https://www.codeplex.com/site/users/view/DavidSimner)
    • [#3460](https://nuget.codeplex.com/workitem/3460) - 修复如果 requireApiKey = true 但标头 X-NUGET-APIKEY 不存在时出现 NullReferenceException 的 bug
  14. [Michael Friis](https://www.codeplex.com/site/users/view/friism) (@friism)
    • [#3278](https://nuget.codeplex.com/workitem/3278) - 修复 NuGet.Build 目标文件,以便其可在 MonoDevelop 上正常工作
  15. [Pranav Krishnamoorthy](https://www.codeplex.com/site/users/view/pranavkm) (@pranav_km)
    • 通过增加并行化来提高 Restore 命令的性能

此版本中值得注意的功能

NuGet 2.7 引入了包还原的新方法,同时还克服了一大障碍:包还原同意现在默认处于打开状态! 此新方法和隐式同意的组合将大大简化包还原场景。

对于 NuGet 版本 2.0、2.1、2.2、2.5 和 2.6,用户需显式允许 NuGet 在生成期间下载缺少的包。 如果未显式授予此同意,则已启用包还原的解决方案在用户授予同意之前将无法生成。

从 NuGet 2.7 开始,包还原同意默认处于打开状态,同时还允许用户使用 Visual Studio 中 NuGet 设置内的复选框按需以显式方式选择退出包还原。 针对隐式同意的此更改会影响以下环境中的 NuGet:

  • Visual Studio 2013 预览版
  • Visual Studio 2012
  • Visual Studio 2010
  • nuget.exe 命令行实用工具

Visual Studio 中的自动包还原

从 NuGet 2.7 开始,即使尚未为解决方案显式启用包还原,NuGet 也会在生成期间在 Visual Studio 中自动下载缺失的包。 在生成项目或解决方案时(但在调用 MSBuild 之前),会在 Visual Studio 中执行此自动包还原操作。 由此会带来一些巨大好处:

  1. 无需对解决方案再使用“启用 NuGet 包还原”手势
  2. 无需修改项目,且 NuGet 不会对项目进行更改,从而确保启用包还原
  3. 在调用 MSBuild 之前,会还原所有 NuGet 包(包括针对属性/目标文件的 MSBuild 导入),以确保在生成期间正确识别这些属性/目标

若要在 Visual Studio 中使用自动包还原,只需执行一项操作:

  1. 不签入 packages 文件夹

可通过多种方式从源控制省略 packages 文件夹。 有关详细信息,请参阅包和源控制主题。

尽管所有用户均会隐式选择自动包还原同意,但可通过 Visual Studio 中的包管理器设置轻松选择退出。

Package Manager Settings

简化从命令行执行包还原

NuGet 2.7 为 nuget.exe 引入一项新功能:nuget.exe restore

利用此新 Restore 命令,可通过接受将解决方案文件或文件夹用作参数,从而轻松还原针对解决方案的所有包。 此外,当当前文件夹中只有一个解决方案时,会隐含该参数。 这意味着会执行以下所有工作(来自包含单个解决方案文件 (MySolution.sln) 的文件夹):

  1. nuget.exe restore MySolution.sln
  2. nuget.exe restore .
  3. nuget.exe restore

Restore 命令将打开解决方案文件并查找解决方案中的所有项目。 在此处,它将查找其中每个项目的 packages.config 文件,并还原找到的所有包。 此外,它还会还原在 .nuget\packages.config 文件中找到的解决方案级包。 有关新 Restore 命令的详细信息,请参阅命令行参考

新的包还原工作流

我们对包还原的这些更改感到兴奋,因为它引入了新的工作流。 若要从源代码管理中省略包,只需不提交 packages 文件夹即可。 打开和生成解决方案的 Visual Studio 用户将看到自动还原的包。 对于命令行生成,只需在调用 msbuild 之前先调用 nuget.exe restore。 无需再记得对解决方案使用“启用 NuGet 包还原”手势,也无需再需要修改项目来更改生成。 此外,对于包含 MSBuild 导入的包,这也会带来大幅改进的体验,尤其是对通过 NuGet 的以下最新功能来添加的导入:从 \build 文件夹自动导入属性/目标文件

除我们自己已完成的工作外,我们还与某些重要的合作伙伴开展合作,以便完善此新方法。目前,我们尚未为其设定具体时间线,但每个合作伙伴都和我们一样对此新方法感到十分兴奋。

  • Team Foundation Service - 它们正努力将针对 nuget.exe restore 的调用集成到默认生成场景中。
  • Windows Azure 网站 - 它们正努力允许用户将项目推送到 Azure,并在生成网站之前调用 nuget.exe restore
  • TeamCity - 它们正在更新适用于 TeamCity 8.x 的 NuGet 安装程序插件
  • AppHarbor - 它们正努力允许用户将存储库推送到 AppHarbor,并在生成解决方案之前调用 nuget.exe restore

对于上述每个合作伙伴,他们均会使用自己的 nuget.exe 副本,而无需你在解决方案中携带 nuget.exe。

已知问题

在初始 2.7 版本中,nuget.exe restore 存在两个已知问题,但它们已在 2013 年 9 月 6 日通过 NuGet.CommandLine 包的更新进行修复。 此更新也在 CodePlex 上的 [NuGet 2.7 download page](https://nuget.codeplex.com/releases/view/107605) 中提供。 运行 nuget.exe update -self 将更新到最新版本。

已修复的问题为:

  1. [New package restore doesn't work on Mono when using SLN file](https://nuget.codeplex.com/workitem/3596)
  2. [New package restore doesn't work with Wix projects](https://nuget.codeplex.com/workitem/3598)

由于[Automatic Package Restore does not work for projects under a solution folder](https://nuget.codeplex.com/workitem/3625),新的包还原工作流也存在一个已知问题。 此问题已在 NuGet 2.7.1 中修复。

项目重定向和升级生成错误/警告

重定向或升级项目后,多次发现某些 NuGet 包无法正常工作。 不幸的是,没有迹象能表明此问题,同时也无如何解决它的相关指导。 借助 NuGet 2.7,我们现在会使用某些 Visual Studio 事件来识别重定向或升级项目的方式何时会影响已安装的 NuGet 包。

如果我们检测到重定向或升级影响了任意包,我们便会发出即时生成错误,以便告知你。 除该即时生成错误之外,我们还会在 packages.config 文件中为此重定向操作影响的所有包保留 requireReinstallation="true" 标志,同时 Visual Studio 中的每个后续生成也会为这些包发出生成警告。

虽然 NuGet 无法执行自动操作来重新安装受影响的包,但我们希望此指示和警告可帮助发现何时需重新安装包。 此外,我们还在处理这些错误消息定向到的包重新安装指南文档

NuGet 配置默认值

很多公司都在内部使用 NuGet,但却难以指导其开发人员使用内部包源,而不是 nuget.org。NuGet 2.7 引入了“配置默认值”功能,它可为以下对象指定计算机范围内的默认值:

  1. 已启用的包源
  2. 已注册但被禁用的包源
  3. 默认 nuget.exe 推送源

现在,可在位于 %ProgramData%\NuGet\NuGetDefaults.Config 的文件中配置其中每一项。 如果此配置文件指定了包源,则不会自动注册默认 nuget.org 包源,而是改为注册 NuGetDefaults.Config 中的包源。

虽然并不强制使用此功能,但我们希望各公司使用组策略来部署 NuGetDefaults.Config 文件。

请注意,此功能绝不会导致从开发人员的 NuGet 设置中删除包源。 也就是说,如果开发人员已使用 NuGet,即意味着已注册 nuget.org 包源,创建 NuGetDefaults.Config 文件后将不会删除此包源。

有关此功能的详细信息,请参阅 NuGet 配置默认值

重命名默认包源

NuGet 始终会注册一个名为“NuGet 官方包源”的默认包源,且该包源指向 nuget.org。此名称较为啰嗦,也没有指定它实际指向的位置。 为解决这两个问题,我们已在 UI 中将此包源重命名为“nuget.org”。 包源的 URL 也已更改为包含“www.”前缀。 使用 NuGet 2.7 后,现有“NuGet 官方包源”的名称将自动更新为“nuget.org”,而其 URL 则为“https://www.nuget.org/api/v2/”。

性能改进

我们在 2.7 版本中进行了一些性能改进,从而实现更小的内存占用量、更低的磁盘使用率和更快的包安装速度。 我们还对基于 OData 的源实现了更智能的查询,以减少总体有效负载。

新的可扩展性 API

我们向可扩展性服务添加了一些新 API,以填补先前版本中缺少功能的差距。

IVsPackageInstallerServices

// Checks if a NuGet package with the specified Id and version is installed in the specified project.
bool IsPackageInstalledEx(Project project, string id, string versionString);

// Get the list of NuGet packages installed in the specified project.
IEnumerable<IVsPackageMetadata> GetInstalledPackages(Project project);

IVsPackageInstaller

// Installs one or more packages that exist on disk in a folder defined in the registry.
void InstallPackagesFromRegistryRepository(string keyName, bool isPreUnzipped, bool skipAssemblyReferences, Project project, IDictionary<string, string> packageVersions);

// Installs one or more packages that are embedded in a Visual Studio Extension Package.
void InstallPackagesFromVSExtensionRepository(string extensionId, bool isPreUnzipped, bool skipAssemblyReferences, Project project, IDictionary<string, string> packageVersions);

仅开发依赖项

此功能由 Adam Ralph 提供,它允许包作者声明仅在开发时使用且无需包依赖项的依赖项。 通过将 developmentDependency="true" 属性添加到 packages.config 内的包中,nuget.exe pack 将不再将此包作为依赖项包含在内。

已删除对 Visual Studio 2010 Express for Windows Phone 的支持

2.7 版本中的新包还原模型由不同于主 NuGet VSPackage 的新 VSPackage 实现。 由于技术问题,此全新 VSPackage 在 Visual Studio 2010 Express for Windows Phone SKU 中无法正常工作,因为我们与其他受支持的 Visual Studio SKU 共享同一代码库。 因此,从 NuGet 2.7 开始,我们将从已发布扩展中删除对 Visual Studio 2010 Express for Windows Phone 的支持。 对 Visual Studio 2010 Express for Web 的支持仍包含在发布到 Visual Studio 扩展库的主扩展中。

由于我们不确定有多少开发人员仍在该版本的 Visual Studio 中使用 NuGet,因此我们将专为这些用户发布单独的 Visual Studio 扩展,并将其发布到 CodePlex(而不是 Visual Studio 扩展库)。 我们不打算继续维护该扩展,但若此问题会影响你,则请在 CodePlex 上通过提出问题来告知我们。

若要下载 NuGet 包管理器(适用于 Visual Studio 2010 Express for Windows Phone),请访问 [NuGet 2.7 Downloads](https://nuget.codeplex.com/releases/view/107605) 页面。

缺陷修复

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