eliminate-redundant-restores
Remove repeated NuGet restores from multi-step .NET builds safely. USE FOR: build/test/publish steps that each restore, Directory.Build.rsp with -restore, safe restore suppression, NETSDK1004/NETSDK1047 after --no-restore.
Install / Use
npx skills add dotnet/skills --skill eliminate-redundant-restoresInstalls into whichever agent you are using.
SKILL.md
Installable skill definition
Quality Score
Category
Development & EngineeringSupported Platforms
Our assessment of eliminate-redundant-restores
eliminate-redundant-restores scores 91/100 on our quality scale, 1024th of 4,577 Development & Engineering skills we index (top 23%).
Its SKILL.md is 10.0 KB long, well organised into 15 sections with 1 code example: a thorough specification that gives an agent plenty to work with.
With 5,471 GitHub stars, it is one of the more widely adopted skills in the catalogue.
Maintenance, license and trust
- The repository was last updated 27 days ago, so eliminate-redundant-restores is actively maintained.
- It is released under the MIT license, a permissive license that allows use, modification and commercial use with attribution.
- Its trust signals score 100/100, with no cautions. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.
Safety scan
No issues foundOur scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands.
Automated pattern scan on 2026-10-21. It catches known dangerous patterns, not every risk — read a skill before letting an agent act on it.
eliminate-redundant-restores compared with similar skills
All 4 of these similar skills score higher than eliminate-redundant-restores; compare them before choosing.
| Skill | Score | Stars | Updated | Format |
|---|---|---|---|---|
| eliminate-redundant-restores (this skill)by dotnet | 91 | 5.5k | 27d ago | SKILL.md |
| taste-skillby Leonxlnx | 100 | 100.2k | today | CLAUDE.md |
| ai-job-searchby MadsLorentzen | 100 | 62.2k | today | CLAUDE.md |
| claude-howtoby luongnv89 | 100 | 42.4k | 1d ago | CLAUDE.md |
| algorithmic-artby anthropics | 100 | 177.9k | 29d ago | SKILL.md |
Frequently asked questions
- How do I install eliminate-redundant-restores?
- Run
npx skills add dotnet/skills --skill eliminate-redundant-restores. The install tabs above show the steps for each supported agent. - Which AI agents does eliminate-redundant-restores work with?
- It is written for Universal, as a SKILL.md file. Other agents that read the same format can often use it too.
- Is eliminate-redundant-restores safe to use?
- Our scan of the whole file found no instruction hijacking, hidden characters, credential access, data exfiltration or destructive commands. It is MIT-licensed and scores 100/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
- Is eliminate-redundant-restores still maintained?
- The repository was last updated 27 days ago, so eliminate-redundant-restores is actively maintained.
Skill content
View source on GitHubname: eliminate-redundant-restores description: "Remove repeated NuGet restores from multi-step .NET builds safely. USE FOR: build/test/publish steps that each restore, Directory.Build.rsp with -restore, safe restore suppression, NETSDK1004/NETSDK1047 after --no-restore. DO NOT USE FOR: slow first restore, only one restore, version or lock errors, unranked build slowness (use build-perf-baseline)." license: MIT
Eliminate Redundant Restores
A no-op restore still evaluates every project and checks restore state, so each extra restore in a multi-step build costs seconds to tens of seconds in a large repo. The cure is easy to get wrong: --no-restore on a step that no earlier restore actually covered turns a slow build into a failed one. This skill finds which invocations restore, proves which are already covered, and changes only those.
When to Use
- A pipeline or script runs several
dotnet/msbuildsteps and the log shows restore output in more than one of them - A restore step exists, yet later steps still print
Determining projects to restore... - A repository
Directory.Build.rspor the active MSBuild installation'sMSBuild.rspcontains-restore - Someone asks where
--no-restoreor-restore:falsecan safely be added NETSDK1004orNETSDK1047appeared after--no-restorewas added
When Not to Use
- The first restore is slow (feed latency, missing package cache): that is caching, not redundancy
- There is only one restore across all invocations: nothing to deduplicate
- Restore errors about versions, lock files or auditing: fix the restore itself
- Unranked "why is my build slow": start with
build-perf-baseline, thenbuild-perf-diagnostics
Inputs
Discover repository inputs in the working directory; do not ask the user for paths.
- CI definitions (
*.yml,.github/workflows,azure-pipelines*.yml,Jenkinsfile) and build scripts (build.cmd,build.sh,build.ps1,eng/) Directory.Build.rsp,Directory.Build.props/.targets,NuGet.config- Auto-loaded
MSBuild.rspbeside the active MSBuild executable, or response files passed explicitly with@file. A repository-localMSBuild.rspis not auto-loaded - Restore evidence if present: step logs or a binlog
Workflow
Step 1: Confirm restore is repeated and worth removing
- Log evidence:
Determining projects to restore...orAll projects are up-to-date for restore.once per invocation. - Binlog evidence: restore evaluations carry the global properties
MSBuildRestoreSessionIdandExcludeRestorePackageImports=true; the Target Performance Summary listsRestorewith N calls. - Quantify each no-op restore. If there is one restore, or the repeated ones total about a second, report "nothing worth removing" and stop without editing.
Step 2: Inventory every invocation in execution order
| Invocation | Restores? |
|---|---|
| dotnet build, test, publish, pack | Implicitly, unless --no-restore; also check inherited rsp flags |
| dotnet run | Implicitly before building; --no-restore can still inherit rsp restore on older SDKs. With --no-build, no build or restore runs |
| dotnet test, publish, pack with --no-build | No implicit restore, but an rsp -restore can still enable restore; add --no-restore -restore:false |
| dotnet msbuild, msbuild.exe, CI MSBuild tasks | With -restore or -t:Restore, including flags inherited from repository Directory.Build.rsp or installation-level MSBuild.rsp, even when a step looks build-only |
| dotnet restore, nuget restore, msbuild -t:Restore | Explicit restore |
| CI build task with a "restore packages" option | Check its default |
Starting with .NET SDK 9.0.1xx, --no-restore forwards -restore:false to override rsp flags; older SDKs can still inherit -restore despite skipping the CLI's implicit restore. Whenever an rsp enables restore, use the version-independent --no-restore -restore:false with dotnet build, test, publish or pack, even with --no-build. dotnet msbuild and msbuild.exe take -restore:false, not --no-restore.
dotnet run does not expose the MSBuild -restore:false override. With an rsp on older SDKs, first build using dotnet build --no-restore -restore:false, then run using dotnet run --no-build with the same project, configuration, framework and runtime inputs (or execute the built DLL directly). Passing -restore:false to dotnet run is not a restore-suppression strategy.
Step 3: Decide per invocation
Keep the first restore. Skip a later one only when all four checks pass:
| Check | If it fails |
|---|---|
| Same project set. A restore covers its entry project or solution and that project's ProjectReference closure. It does not cover a project in another solution or .slnf, a tool built from another path, or a project an orchestrating .proj builds through the MSBuild task (-restore on the orchestrator leaves those unrestored and they fail with NETSDK1004) | Keep restore on that step, or add the project to the explicit restore step |
| Same restore inputs. -r/--runtime, RID-producing -a/--arch, --os, --ucr/--use-current-runtime, TargetFramework(s), RuntimeIdentifier(s), PublishAot, package sources (--source, --configfile, RestoreSources), RestorePackagesPath, and any -p: value a PackageReference condition reads. Architecture/OS options combine with the SDK's current RID; --use-current-runtime selects it. Missing RID targets fail with NETSDK1047 (Assets file ... doesn't have a target for 'net10.0/linux-x64') | Match the effective RID in the explicit restore (for example publish --os linux --arch x64 requires restore -r linux-x64), or keep restore on the later step. A generic restore does not cover these aliases merely because there is no -r. Do not require SelfContained=true on restore solely because publish is self-contained: RID-only restore covers ordinary SDK projects. Match Configuration or SelfContained only if repository conditions change package inputs |
| Same available restore state. Earlier project.assets.json files must exist where the later invocation looks for them. Match --artifacts-path, UseArtifactsOutput/ArtifactsPath, and MSBuildProjectExtensionsPath/BaseIntermediateOutputPath; another job or workspace does not automatically share these files | Align the explicit restore's output layout with build/test, or retain restore in the later workspace. For build --artifacts-path artifacts --no-restore, use restore --artifacts-path artifacts first; ordinary obj/ assets do not cover that layout |
| Nothing changes packages in between. A step that generates or edits a project, runs dotnet add package, rewrites Directory.Packages.props or NuGet.config invalidates the earlier restore | Move the explicit restore after that step |
Step 4: Apply the smallest change
- One explicit restore carrying every restore input, then
--no-restore,-restore:falseor--no-buildon later steps. - Several
dotnet teststeps over one solution: build once, thendotnet test --no-buildon each. Add--no-restore -restore:falseif an rsp enables restore, including on .NET 8 and earlier.--no-restorealone still rebuilds. - Keep self-contained publish settings. A
publish --no-buildstill needs a prior build with matching configuration, framework, RID and self-contained output; restore compatibility does not prove that build outputs exist. - Scope the change to CI and scripts. Leave
-restoreinDirectory.Build.rsp, because developers rely on it; pass-restore:falseper invocation instead. - Never remove the first restore. If it is a
--locked-modegate, keep it there. - Do not bundle static graph restore or package caching into this change.
# One restore carries every input later steps use
dotnet restore MyApp.sln -r linux-x64
# Explicit overrides also work when an rsp enables restore on older SDKs
dotnet build MyApp.sln -c Release --no-restore -restore:false
dotnet test MyApp.sln -c Release --no-build --no-restore -restore:false
dotnet publish src/Api -c Release -r linux-x64 --no-restore -restore:false
# msbuild invocations need the explicit switch if an rsp file adds -restore
dotnet msbuild Packaging.proj -t:Pack -restore:false
Step 5: Validate and report truthfully
- Run the changed pipeline or script end to end in a clean temporary copy (no
obj/, noproject.assets.json). A project that was never restored only fails there. YAML syntax or flag-presence checks do not validate restore coverage or test execution. If you cannot run it, say "not validated" and list the steps and projects to confirm. - Success evidence: every later step passed;
Restorecalls (binlog) orDetermining projects to restorelines fell from N to the expected count; for a time claim, before/after medians of at least three runs. - Report a restore failure (NETSDK1004, NETSDK1047) separately from a build failure, and never claim success after either.
Output
Explain which steps restored, which earlier restore covers them, what changed, and what remains unvalidated. State whether redundant restores were removed or no change was needed, keeping the required first restore. Use prose or a findings table as appropriate; no fixed table headings or verdict syntax are required.
Common Pitfalls
| Pitfall | Solution |
|---|---|
| Adding --no-restore to every command | Apply the Step 3 checks per step |
| Missing that an rsp adds -restore to "build-only" msbuild steps | Search for *.rsp before concluding a step does not restore |
| Deleting -restore from Directory.Build.rsp | Override per CI invocation; the rsp serves developers |
| Orchestrator .proj restored, children not | Restore each child explicitly, or keep restore on the step that builds it |
| Publishing with -r, architecture/OS options, or --use-current-runtime after a generic restore | Restore with the same effective runtime identifier, including SDK-host defaults used by the aliases |
| A generator step edits PackageReferences after restore | Restore after the generator |
Related Skills
taste-skill
100.2kAgent skills that give coding agents taste: art direction, reference images and a browser check instead of generic AI pages
ai-job-search
62.2kThe job search that runs on your machine. AI job application framework built on Claude Code: evaluate postings, tailor CVs, write cover letters, prep interviews. Fork it and own it.
claude-howto
42.4kA visual, example-driven guide to Claude Code — from basic concepts to advanced agents, with copy-paste templates that bring immediate value.
algorithmic-art
177.9kCreating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems.
Languages
Trust signals
From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.
