NuGet 6.0 发行说明

NuGet 分发车辆:

1 随具有 .NET Core 工作负荷的 Visual Studio 2022 一起安装

摘要:6.0.6 新增功能

  • [安全性]:Microsoft 安全公告 CVE-2024-0057 | NuGet 客户端绕过安全功能漏洞 - #12653

摘要:6.0.5 中的新变化

  • [安全性]:Microsoft 安全公告 CVE-2023-29337 | NuGet 客户端远程代码执行漏洞 - #12653

备注

Linux 上存在行为中断性变更。 NuGet 在其各种操作期间用于存储临时文件的位置已从 /tmp/NuGetScratch 更改为 /tmp/NuGetScratch<username>。 例如,对于用户 User1,临时文件夹将变为 /tmp/NuGetScratchUser1

摘要:6.0.3 中的新变化

  • [安全性]:Microsoft 安全通报 CVE-2022-41032 | .NET 特权提升漏洞 - #12149

备注

Visual Studio 17.0、MSBuild 17.0 和 .NET 6.0 需要 NuGet.exe 6.0 或更高版本。

摘要:6.0.2 中的新变化

  • [安全性]:Microsoft 安全公告 CVE 2022-30184 | .NET 信息泄露漏洞 - #11883

摘要:6.0.0 中的新变化

🎉 这是针对 .NET 6.0 提供 NuGet 包的完整创作与还原支持的第一个版本 🎉

.NET 6 支持

NuGet 6.0 是针对 .NET 6.0 提供 NuGet 包的完整创作与还原支持的第一个版本。 现在可面向以下目标框架:

  • net6.0
  • net6.0-windows
  • net6.0-android
  • net6.0-ios
  • net6.0-macos
  • net6.0-maccatalyst
  • net6.0-tvos
  • net6.0-tizen

.NET 6

如果目前不熟悉 .NET 6.0 目标或其未来状况,请记得查看 .NET 6.0 TFM 规范

资源映射

今年早些时候,众多包管理器意识到依赖关系混淆攻击,其中某一用户被欺骗安装恶意依赖关系,而不是其打算安装的依赖关系。 为强化软件供应链免受这些攻击,NuGet 团队开发了一项新功能,可用于将依赖关系映射到特定源。 以下示例说明了如何使用源映射来保护项目。

<!-- Define a global packages folder for your repository. -->
<!-- This is where installed packages will be stored locally. -->
<config>
  <add key="globalPackagesFolder" value="globalPackagesFolder" />
</config>

<!-- Define my package sources, nuget.org and contoso.com. -->
<!-- `clear` ensures no additional sources are inherited from another config file. -->
<packageSources>
  <clear />
  <!-- `key` can be any identifier for your source. -->
  <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
  <add key="contoso.com" value="https://contoso.com/packages/" />
</packageSources>

<!-- Define mappings by adding package ID patterns beneath the target source. -->
<!-- Contoso.* packages will be restored from contoso.com, everything else from nuget.org. -->
<packageSourceMapping>
  <!-- key value for <packageSource> should match key values from <packageSources> element -->
  <packageSource key="nuget.org">
    <package pattern="*" />
  </packageSource>
  <packageSource key="contoso.com">
    <package pattern="Contoso.*" />
  </packageSource>
</packageSourceMapping>

可在今年早些时候发布的博文中详细了解源映射。

Visual Studio 中的包漏洞

在 Visual Studio 中使用 NuGet 包管理器时,现在会看到针对包的包漏洞,其中包括漏洞的数量和严重性等详细信息,以及可了解有关各公告的详细信息的直接链接。

Visual Studio Package Vulnerabilities

重试与回退行为

现在有一个 NUGET_ENABLE_EXPERIMENTAL_HTTP_RETRY 标志来改进 NuGet 客户端的重试和回退行为,例如增加最大重试次数,以及在遇到互联网连接较弱时增加延迟以实现更具弹性的体验。

排除默认文件扩展名

现在可使用 MSBuild 标志 <AllowedOutputExtensionsInPackageBuildOutputFolder> 编辑包的生成输出中包含的文件扩展名。 这样,便可更好地控制生成输出文件夹中包含的扩展。

改进 Visual Studio 中的弃用信息

Visual Studio 中已弃用的包现在包含指向建议的可用备用包的链接。 可使用此功能快速浏览和安装主动维护的包。

Visual Studio Package Deprecations

在 Visual Studio 中添加包自述文件

现在可直接在 Visual Studio 中添加包 README.md 文件。 自述文件有助于传达有关包的重要信息。 在 NuGet.org 上访问包时,访问者通常会看到的第一个项目。自述文件通常包括有关以下内容的信息:

  • 包的用途
  • 包为什么有用
  • 用户如何开始使用包
  • 用户可获取帮助或为包做出贡献的位置

在我们的博客上详细了解如何将自述文件添加到 NuGet 包

在 Visual Studio 中实现更快的解决方案加载和分支切换

在 Visual Studio 2022 中,NuGet 已重新定义 NuGet 包还原与常见 Visual Studio 组件之间的协定,以便仅调用还原一次而不是多次来提升大型解决方案的性能。 此特性可大幅缩短后台进程完成所需的时间。

安装 Visual Studio 2022 预览版,并告知我们是否发现加载大型解决方案或在分支之间切换时的速度更快!

NuGet 的 SolutionRestoreManager Visual Studio API 已移至 NuGet.VisualStudio 包中

NuGet.SolutionRestoreManager.Interop 不再更新,且其 API 已合并到 NuGet.VisualStudio 包中。 如果要更新现有 Visual Studio 扩展以使用 Visual Studio 2022 (17.0),且先前使用的是 NuGet.SolutionRestoreManager.Interop,则应卸载该包并将 NuGet.VisualStudio 升级/安装为版本 6.0.0。 命名空间和类将保持不变,因此从 API 角度来看它可兼容。

此外,在 Visual Studio 的策略更改之后,NuGet.VisualStudio 将不再使用 EmbedInteropTypes。 因此,扩展将具有对 NuGet.VisualStudio.dll 的编译时间引用。 NuGet 会指示 Visual Studio 使用绑定重定向,因此当 NuGet 更新到较新版本且扩展是针对较旧版本的程序集进行编译时,扩展不会受到影响。 因此,可从 vsix 中取消 NuGet 的程序集以缩小下载大小。 NuGet 的包将更新为在 NuGet 6.2 中自动执行此操作(适用于 Visual Studio 17.2)。

若要从 vsix 中取消 NuGet 的程序集,请将以下内容添加到项目文件:

<ItemGroup>
  <SuppressFromVsix Include="NuGet.VisualStudio.dll" Visible="false" />
  <SuppressFromVsix Include="NuGet.VisualStudio.Contracts.dll" Visible="false" />
</ItemGroup>

功能

  • 添加挂钩,以便从 NuGet 包中排除某些生成输出扩展 - #10690

  • 使用 net6.0 及以上版本时为 xamarin TFM 实现新的优先级 - #10717

  • 在 net6.0 及以上版本项目“回退”到 xamarin.ios 时实现 maccatalyst 警告 - #10718

  • 添加包命名空间支持以作为配置的一部分 - 仅添加读取功能 - #10725

  • 包命名空间:在 PackageReference 还原中下载包时考虑包命名空间筛选 - #10732

  • 在 nuget.exe 和 msbuild /t:restore 中的 packages.config restore 中添加命名空间筛选支持 - #10737

  • 添加用于标识还原源的协定,以帮助 NuGet 更好地完成批处理还原/分支交换。 - #10807

  • 新增对 net6.0-tizen 和 net6.0-android 的支持 - #10819

  • 为 Visual Studio 中的 packages.config restore 添加命名空间筛选支持 - #10823

  • 添加对 TfmSpecificDebugSymbolsFile 的支持,以便在内部版本中提供符号 - #10913

  • 如果安装了易受攻击的包,则在“已安装”选项卡中显示警告图标 - #10982

  • 出现漏洞时,在包列表中按包显示警告图标 - #10983

  • 在 PMUI 的包详细信息窗格中显示包漏洞详细信息 - #10985

  • 在 PM UI 的“详细信息”页面上添加“弃用链接”- #10996

  • [功能]:允许为 NuGet 客户端配置重试计数和退避行为 - #11027

  • [功能]:为 PackageReference 和 PackageDownload 场景中的包命名空间工作解决所有包安装规则。 - #11035

  • [功能]:为包配置样式项目中的包命名空间工作解决所有包安装规则 - #11036

此版本中已修复的问题

DCR:

  • 考虑删除允许其他包管理器显示为兼容的扩展性 - #6623

  • 停止将 EmbedInteropTypes 用于 NuGet 的 VS 扩展包/程序集 - #10892

  • Project.nuget.g.targets 不应追加到 MSBuild 16 或更高版本中的 MSBuildAllProjects - #10895

  • 删除过时的核心 API - #10940

  • 将 NuGet.SolutionRestoreManager.Interop 合并到 NuGet.VisualStudio 中 - #10957

  • 删除 RuntimeEnvironmentHelper.IsDev14 - #11000

  • 将 Newtonsoft.Json 更新到 13.0.1 - #11095

  • [DCR]:将 packageNamespaces 功能重命名为 packageSourceMapping - #11205

Bug:

  • 使用包保存模式 "nuspec" 进行安装始终会重新安装 - #2402

  • Update-Package -reinstall -ProjectName <project> 不适用于 PR - #6088

  • “已添加具有相同键的项”- 当项目图包含 projectName == packageRef 名称(同一版本)时- #6795

  • [测试失败] 建议删除“接受许可证”对话框中的第二个重复字符串“接受许可证”- #8162

  • 无法使用 nuget.exe 删除配置密钥 - #8223

  • msbuild /t:Restore 和 Visual Studio 在程序集名称 != 项目名称时生成不同的资产文件 - #8272

  • 当 999,500 <= count <=999,999 时,PM UI 无法实现下载计数的人性化 - #8800

  • Roslyn 分析器建议“使用包管理器进行安装”会将 NuGet 打开到错误选项卡 - #10124

  • 当项目不是“KnownToBeMSBuildFormat 通过解决方案文件调用”时,StaticGraph Restore 应明确标注 - #10363

  • "nuget spec" 命令生成带 iconUrl 的 .nuspec 文件 - #10400

  • Rfc3161TimestampTokenInfo.GetNonce 可能引发 - #10484

  • Mono 上未禁用 verify 命令 - #10585

  • CreateLockFileTargetLibrary 方法会减慢还原操作 - #10614

  • PackageArchieveReader 未覆盖 CopyNupkgAsync,因此包提取失败 - #10708

  • 将包命名空间信息传播到 restore 命令 - #10736

  • 务必在 PMUI 中的 packages.config 包安装/更新中遵循命名空间筛选 - #10738

  • NuGet.Packaging.Extract:未找到资源中的异常 - #10776

  • 在对符号使用 snupkg 时无法使用嵌入的 PackageReadmeFile - #10791

  • 删除 NuGet 项目初始化中的冗余 UI 延迟开关 - #10824

  • 删除还原代码路径中不必要的 ToList 枚举 - #10835

  • 将 IVsPackageInstallerServices 标记为已弃用 - #10836

  • NuGet 包下载次数已超过 10 亿次显示错误的单位 - #10864

  • 难以在深色主题的“更新”和“合并”选项卡右侧看到数字的背景色 - #10896

  • IVsProjectRestoreInfoSource 改进 - #10898

  • packages.lock.json 与面向 net5.0-windows 的 Sdk-Style C# 项目中断 - #10901

  • 为 IVsSolutionRestoreService4 添加默认实现 - #10908

  • [响应能力] 通过不需要的 GetServiceAsync 扩展从后台线程中删除隐式 RPC - #10916

  • 布尔的装箱操作旨在计算哈希代码,但会导致过度分配 - #10917

  • 循环访问库依赖关系会导致枚举器过度分配 - #10918

  • 兼容性缓存查找会为每个查找分配 Func - #10919

  • DependencyWalker.CreateGraphNode 中的 WhereListIterator 过度分配 - #10920

  • 还原时出现异常:“还原元数据缺少所需的目标框架列表”- #10924

  • 跨托管代码约定共享框架减速器 - #10925

  • 使用不正确的绑定重定向生成 NuGet VSIX - #10946

  • 运行 init 脚本时 NuGet 包管理器 UI 出现延迟 - #10947

  • 支持在 nuget restore/install 和 dotnet restore package 或其他等效命令上传递的 sourceUri - #10948

  • 针对 nuget.exe install 命令的命名空间筛选支持 - #10961

  • 停止为每个段生成原始属性 - #10969

  • 从未选择的可传递引用(修剪后的子图)中出现意外 NU1605 - #10972

  • NuGet.Localization 没有包图标 - #10975

  • 避免在计算项目关闭时不必要地调整字典大小 - #10976

  • 有关 ISettings.AddOrUpdate 的文档出现冲突 - #10980

  • 复制文件和验证签名时使用共用字节数组 - #10988

  • 避免在依赖关系演练器中进行 Task.WhenAny 分配 - #10989

  • 务必在 PMC 中的 packages.config 包安装/更新中遵循命名空间筛选 - #11001

  • 务必在 IV 的安装程序 API 的 packages.config 包安装/更新中遵循命名空间筛选 - #11002

  • [Bug]:当所选包已安装时,PM UI 将下载计数显示为 0 - #11012

  • 减少 VersionFormatter 中的分配 - #11014

  • 已过时的未使用类型:LibraryDependencyType 和相关类型 - #11015

  • [Bug]:nuget.exe install packages.config 未遵循 -PackageSaveMode nuspec - #11018

  • [Bug]:$(IsPackable) 未引用 - #11025

  • 使用用于 PMUI 包命名空间筛选的多源存储库来创建 Apex 测试 - #11026

  • [Bug]:[辅助功能] 难以在使用浅色或深色主题的 PM UI 搜索结果中看清链接 - #11055

  • IVsSolutionRestoreService4 应扩展 IVsSolutionRestoreService3 - #11098

  • [Bug]:应在 PMUI 的详细信息窗格中对齐公告链接 - #11101

  • 已安装的易受攻击/弃用包版本的警告图标的工具提示不够清晰 - #11103

  • [响应能力] RestoreOperationLogger+StatusBarProgress.Dispose 会阻止等待 UI 线程的线程池线程 - #11115

  • 添加自上次还原指标以后经过的时间 - #11124

  • [Bug]:处理 5.9.1 与 5.10.0 之间的递归 <files> 条目时出现 nuget.exe 回归 - #11125

  • 当项目具有待定提名时会等待 WhenNominated - #11132

  • 支持 dotnet add package 上传递的 sourceUri 选项 - #11140

  • [Bug]:VS PM UI 不显示包的 JPEG 图标 - #11144

  • UI 延迟:nuget.packagemanagement.visualstudio.dll!NuGet.PackageManagement.VisualStudio.VsCoreProjectSystemReferenceReader+<GetProjectReferencesAsync>d__ - CPS 项目 - #11162

  • [Bug]:dotnet list package --outdated --interactive 会让凭据提供程序将列出的每个包的缓存失效 - #11169

  • [Bug]:无法为某一包找到匹配的命名空间时,针对 package.config 场景的包命名空间会将用所有源用作回退选项 - #11170

  • 避免在 NuGet 项目初始化期间对 UI 线程执行 MEF 查找 - #11176

  • [Bug]:“已安装”选项卡中警告指示器图像的工具提示不再有效 - #11183

  • 检索 MEF 服务的所有 ServiceLocator 调用均应避免使用 UI 线程。 - #11201

  • [Bug]:Visual Studio 中缺少遥测事件 - #11206

  • 避免重复的 EnvDTEProjectUtility.IsSupportedAsync 调用 - #11207

  • 添加 IVsSolutionManager.GetSolutionDirectoryAsync - 提高性能,并停止阻止异步代码路径中的调用线程。 - #11208

  • 重命名产品/测试代码中的类型/变量以反映包命名空间功能的新名称 - #11216

  • [Bug]:ArPow 生成在不相关 Git 存储库的子目录中效果不佳 - #11227

  • dotnet list package --vulnerable, --deprecated, --outdated 不适用于仅传递性的正值 - #10767

版本 6.0 中所有已修复问题的列表

版本 6.0.0 中提交的列表

摘要:6.0.1 中的新变化

只有 Visual Studio 已使用此版本的 NuGet 进行更新。

此版本中已修复的问题

  • [Bug]:无法从 Visual Studio 17 中的 Service Broker 获取 INuGetProjectService - #11367
  • [Bug]:包管理器控制台初始化可能会导致死锁 - #11320

版本 6.0.1 中提交的列表

社区参与

感谢帮助实现此出色 NuGet 版本的所有参与者!

PR 问题
omajid 3866 Rfc3161TimestampTokenInfo 中的句柄 nonce 为 null - #10484
marcin-krystianc 3934 为 LockFileTargetLibrary 添加缓存 - #10614
krafs 4151 从关于 ISettings.AddOrUpdate 的文档中删除返回值 - #10980
huangqinjin 4148 修复 PackageSaveMode nuspec 始终会重新安装的问题 - #2402
Insomniak47 4190 修复(文档):删除参与准则中指向已关闭/死角链接的链接 - #8987
marcin-krystianc 4194 让性能脚本考虑还原操作失败 - #9968
eriawan 4159 用单引号修复 Surround ($IsPackable) - #11025
huangqinjin 4193 安装 packages.config 应遵循 PackageSaveMode - #11018
mfkl 4199 测试:使用新的 DependencyGraphSpec - #11168
omajid 4254 将 --work-tree 与 git apply 配合使用 - #11227

欢迎反馈

反馈对我们非常重要。 如果此版本存在问题,请查看 GitHub 问题Visual Studio 开发者社区以了解现有问题。 对于 NuGet 中的新问题,请报告 GitHub 问题。 对于常规 NuGet 体验问题,请通过报告问题选项告知我们;该选项位于帮助 > 报告问题下的常用 IDE 中。