NuGet 2.7 发行说明

用于 WebMatrix 的 NuGet 2.6.1 发行说明 | 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 对话框,显示错误选项卡中的更新
    • 修复 ProjectManager 中 Project.TargetFramework 可能为 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) - 修复了在文件不存在时推送命令返回错误但退出代码为 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”属性中的通配符的问题。
  10. [Justin Dearing](http://www.codeplex.com/site/users/view/zippy1981)@zippy1981
    • [#3307](http://nuget.codeplex.com/workitem/3307) - 修复 bug NuGet.targets 在还原包时未将 $(Platform) 传递给 nuget.exe。
  11. [Brian Federici](http://www.codeplex.com/site/users/view/benerdin)
    • [#3294](http://nuget.codeplex.com/workitem/3294) - 修复了 nuget.exe 包命令中的 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) - 修复 bug NullReferenceException(如果 requireApiKey = true),但标头 X-NUGET-APIKEY 不存在
  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
    • 通过提高并行度来增强恢复命令性能

版本中的显著功能

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

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

从 NuGet 2.7 开始,包还原同意默认为 ON,同时允许用户根据需要显式 选择退出 包还原,使用 Visual Studio 中 NuGet 设置中的复选框。 隐式许可的此更改会影响以下环境中的 NuGet:

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

Visual Studio 中的自动包还原

从 NuGet 2.7 开始,即使未为解决方案显式启用包还原,NuGet 也会在 Visual Studio 的构建过程中自动下载缺失的包。 生成项目或解决方案时,会在 Visual Studio 中执行此自动包还原,但在调用 MSBuild 之前。 这会产生一些显著的好处:

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

若要在 Visual Studio 中使用自动包还原,只需进行以下一项操作(或不操作):

  1. 不要将packages文件夹签入

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

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

包管理器设置

从命令行简化包还原

NuGet 2.7 引入了 nuget.exe的新功能: nuget.exe restore

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

  1. nuget.exe 还原MySolution.sln
  2. nuget.exe 还原。
  3. nuget.exe restore

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

新的包恢复工作流

我们对包还原的这些更改感到兴奋,因为它引入了新的工作流。 如果要从版本控制中省略您的包,只需不提交 packages 文件夹。 打开和生成解决方案的 Visual Studio 用户将看到自动还原的包。 对于命令行生成,只需在调用nuget.exe restore前调用msbuild。 您不再需要记得在解决方案中执行“启用 NuGet 包还原”操作,我们也不再需要修改项目以更改构建。 此外,对于包含 MSBuild 导入的包,这也会显著改善体验,尤其是对于通过 NuGet 的新功能从 \build 文件夹中 自动导入 props/targets 文件 的导入。

除了我们自己所做的工作外,我们还与一些重要合作伙伴合作,以全面解决这一新方法。我们还没有具体时间表,但每个合作伙伴都和我们对新方法一样兴奋。

  • 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 还原存在两个已知问题,但通过对 NuGet.CommandLine 包的更新,问题在 2013 年 9 月 6 日得到修复。 此更新也可通过 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”作为其名称和“https://www.nuget.org/api/v2/”作为其 URL。

性能改进

我们在 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.confignuget.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)