NuGroom can automatically create feature branches and pull requests to update outdated package references across your Azure DevOps repositories.
.csproj, .vbproj, .fsproj) files are pushed, and PRs are opened against the target branchProjects within each repository are processed in order of dependency count (fewest dependencies first).
The scope controls the maximum version change that will be applied. Scopes are cumulative:
| Scope | Allowed Updates | Example |
|---|---|---|
Patch |
Patch only | 1.2.3 → 1.2.5 |
Minor |
Minor and patch | 1.2.3 → 1.4.0 |
Major |
Any version | 1.2.3 → 2.0.0 |
develop/* picks the latest develop/1.2.3 branch). If not specified, the repository’s default branch is used.feature/update-nuget-references-20250224-155601.Dry-run is enabled by default in configuration ("DryRun": true). Use --dry-run on the CLI or set "DryRun": false / --update-references to apply changes.
In dry-run mode the tool shows:
Pin packages to prevent automatic updates:
{
"Update": {
"PinnedPackages": [
{
"PackageName": "Newtonsoft.Json",
"Version": "13.0.1",
"Reason": "Breaking changes in newer versions"
},
{
"PackageName": "Serilog",
"Version": null,
"Reason": "Keep current version until logging migration is complete"
}
]
}
}
When updating package references, the tool can automatically increment version properties (<Version>, <AssemblyVersion>, <FileVersion>) in each project file that receives updates. This ensures the project version reflects that its dependencies have changed.
CLI flags:
--increment-project-version [scope] — increment <Version> only--increment-project-assemblyversion [scope] — increment <AssemblyVersion> only--increment-project-fileversion [scope] — increment <FileVersion> only--increment-project-version-all [scope] — increment all three propertiesThe optional [scope] parameter controls which component is bumped:
| Scope | Example |
|---|---|
Patch (default) |
1.2.3 → 1.2.4 |
Minor |
1.2.3 → 1.3.0 |
Major |
1.2.3 → 2.0.0 |
Both 3-part (Major.Minor.Patch) and 4-part (Major.Minor.Build.Revision) version formats are supported. Lower components are reset to zero when a higher component is incremented.
Config file:
{
"Update": {
"VersionIncrement": {
"IncrementVersion": true,
"IncrementAssemblyVersion": true,
"IncrementFileVersion": true,
"Scope": "Patch"
}
}
}
Version properties that do not exist in a project file are silently skipped. The increment is only applied to .csproj / .vbproj / .fsproj project files — Directory.Packages.props and packages.config files are not affected.
Use --minage <days> or "MinAgeDays": 30 in the config file to skip package versions that were published too recently. When set, only versions whose publish date is at least the specified number of days ago are considered as the latest available version.
This is useful to avoid adopting brand-new releases that might contain undiscovered bugs:
# Only consider versions published at least 30 days ago
nugroom --config settings.json --dry-run --minage 30
{
"MinAgeDays": 30
}
The filter applies to all resolution — scans, updates, and sync (when no explicit target version is specified). If no version meets the age threshold, the package is reported as not found on the feed.
When the minimum age filter is active, security updates bypass the age threshold. If the age-filtered latest version of a package has known NuGet vulnerabilities, the tool automatically falls back to the newest non-vulnerable version — even if that version was published more recently than the minimum age cutoff.
This matches the behavior of Renovate’s minimumReleaseAge, which allows security patches through regardless of age constraints. The bypass ensures that known-vulnerable versions are never selected as the update target when a safer alternative exists.
Use --source-packages-only
Add required and optional reviewers to created pull requests:
{
"Update": {
"RequiredReviewers": ["lead@company.com", "security@company.com"],
"OptionalReviewers": ["teammate@company.com"]
}
}
Or via CLI (both are repeatable):
--required-reviewer "lead@company.com" --optional-reviewer "teammate@company.com"
The --sync option lets you force a specific package to an exact version across all repositories in a single operation. Unlike --update-references which updates many packages within a scope, --sync targets one package and supports both upgrades and downgrades.
# Sync to latest available version
NuGroom --config settings.json --sync Newtonsoft.Json
# Sync to a specific version (upgrade or downgrade)
NuGroom --config settings.json --sync Newtonsoft.Json 13.0.1
# Preview what would change
NuGroom --config settings.json --sync Newtonsoft.Json 13.0.1 --dry-run
.csproj, .vbproj, .fsproj) referencing the specified package--update-references, --sync has no scope restriction. It always sets the exact target version.DryRun setting from UpdateConfig. Pass --dry-run or set "DryRun": true to preview changes.SourceBranchPattern and TargetBranchPattern from UpdateConfig.RequiredReviewers / OptionalReviewers from UpdateConfig, with Renovate reviewers override per repository.ignoreDeps and disabled packageRules. If the package is excluded by Renovate in a repository, that repository is skipped.See also: CLI Reference · Configuration · Renovate Compatibility