SuperAPI AI 工具集

eliminate-redundant-restores

部署与运维

查看项目

更新于 10-28 02:28

技能介绍

该技能用于在多步骤 .NET 构建中安全移除重复的 NuGet 还原。即使一次还原是空操作,也会评估每个项目并检查还原状态,大型仓库中每次多余还原可能耗费数秒到数十秒;但若给未被先前还原覆盖的步骤加 --no-restore,会把缓慢构建变成失败构建。因此它先找出哪些调用会还原、证明哪些已被覆盖,再只修改这些调用。

适用场景:

  • 流水线或脚本运行多个 dotnet/msbuild 步骤,日志中不止一处出现还原输出;
  • 已有还原步骤,后续步骤仍打印 Determining projects to restore...;
  • 仓库 Directory.Build.rsp 或当前 MSBuild 安装旁的 MSBuild.rsp 含 -restore;
  • 需要判断 --no-restore 或 -restore:false 能安全加在哪里;
  • 添加 --no-restore 后出现 NETSDK1004 或 NETSDK1047。

不适用场景:首次还原本身慢(源延迟、包缓存缺失,属于缓存问题而非冗余);所有调用中只有一次还原;还原本身存在版本、锁文件或审计错误;只是笼统地问“构建为什么慢”(应先做构建性能基线与诊断)。

工作流程:

  1. 确认还原确实重复且值得移除。日志中每次调用出现一次 Determining projects to restore... 或 All projects are up-to-date for restore.;binlog 中还原评估带 MSBuildRestoreSessionId 等全局属性,Target Performance Summary 列出 Restore 调用次数。若只有一次还原,或重复还原合计仅约一秒,报告“无需移除”并停止。
  2. 按执行顺序盘点每次调用是否还原,包括 dotnet build/test/publish/pack(除非 --no-restore)、dotnet run、带 --no-build 的调用、dotnet msbuild/msbuild.exe/CI MSBuild 任务(受 -restore 或 rsp 继承影响)、显式 restore 以及 CI 构建任务的“还原包”选项。从 .NET SDK 9.0.1xx 起 --no-restore 会转发 -restore:false 覆盖 rsp;更早 SDK 可能仍继承 -restore,此时应使用版本无关的 --no-restore -restore:false;msbuild 类调用使用 -restore:false 而非 --no-restore;dotnet run 不暴露该覆盖,可先用 dotnet build 再 dotnet run --no-build。
  3. 逐调用决策:保留首次还原,仅当四项检查都通过才跳过后续还原——项目集合相同(还原只覆盖入口项目及其 ProjectReference 闭包,不覆盖其他解决方案或编排 .proj 通过 MSBuild 任务构建的项目);还原输入相同(运行时标识符、架构、OS、目标框架、PublishAot、包源、RestorePackagesPath 及相关条件属性;RID 不匹配会报 NETSDK1047);可用还原状态相同(较早生成的 project.assets.json 必须位于后续调用查找的位置,注意 --artifacts-path 与中间输出路径);两次之间没有包相关改动(生成器编辑项目、dotnet add package 等会使先前还原失效)。
  4. 应用最小改动:一次显式还原携带所有输入,后续步骤加 --no-restore、-restore:false 或 --no-build;多个 dotnet test 可先构建一次再 --no-build;保留自包含发布所需设置;仅在 CI 和脚本中调整,不要删除 Directory.Build.rsp 中的 -restore,而是逐调用传 -restore:false;永不移除首次还原,锁模式校验应保留。
  5. 在干净临时副本(无 obj/、无 project.assets.json)端到端验证,记录后续步骤通过、Restore 调用或还原输出行数下降,以及至少三次运行的前后中位数;无法运行时明确说明“未验证”。还原失败(NETSDK1004、NETSDK1047)需与构建失败分开报告,二者均不得声称成功。

输出需说明哪些步骤会还原、由哪次较早还原覆盖、改了什么、还有什么未验证,并说明是否移除了冗余还原或无需改动。常见陷阱包括给所有命令加 --no-restore、忽略 rsp 给“纯构建”msbuild 步骤加 -restore、删除 Directory.Build.rsp 中的 -restore、编排项目还原但子项目未还原、泛化还原后以 RID 或架构选项发布、生成器步骤之后未重新还原等。