Visitar URL original
Preserve version ranges when upgrading packages by GREsau · Pull Request #702 · dotnet-outdated/dotnet-outdated · GitHub
Skip to content

Preserve version ranges when upgrading packages - #702

Merged
slang25 merged 21 commits into
dotnet-outdated:masterfrom
GREsau:version-range
Nov 8, 2026
Merged

slang25 merged 21 commits into
dotnet-outdated:masterfrom
GREsau:version-range

Conversation

@GREsau

@GREsau GREsau commented Feb 11, 2026 •

Copy link
Copy Markdown
Contributor

Closes #388

Maintainer note: GREsau's original commits are kept below unchanged. This PR had been waiting since February and the branch had drifted a long way from master, so a maintainer finished it: merged master in, reverted unrelated whitespace changes, and made the follow-up fixes listed at the end. Thank you @GREsau for the fix and the clear write-up!

Fixes #388

This PR changes the behaviour of the --upgrade command to preserve the max version specified in a package reference, e.g. <PackageReference Include="Microsoft.AspNetCore.Authentication.Negotiate" Version="[6.0.13,7)" />.

For example, upgrading a project with would change the version of Microsoft.AspNetCore.Authentication.Negotiate in the csproj from/to:
[6.0.13,7) -> [6.0.36, 7.0.0)
[6.0.13,7] -> [7.0.0]
[6.0.13] -> "No outdated dependencies were detected", as the version is pinned
[6.0.13,) -> 8.0.24
6.0.13 -> 8.0.24
6.* -> 8.0.24
[6.*, 8) -> [7.0.20, 8.0.0)

Note that this does not preserve "floating" versions like 6.*.

However, if the new version is outside the the declared version range (which can happen due to #670), then we remove the maximum version to avoid setting an unsatisfiable version range. e.g. when running dotnet outdated -u -mv 8.0, [6.0.13,7) is updated to 8.0.24 instead of [8.0.24, 7.0.0).

Maintainer follow-up changes

  • Merged master (variable tracking, the CPM --no-restore direct write, file-based apps). Ranges are now written through all of those paths: dotnet add package, Directory.Packages.props with --no-restore, and VersionOverride.
  • Ranges held in MSBuild properties (Version="$(NewtonsoftJsonVersion)" with <NewtonsoftJsonVersion>[12.0.1,13.0.0)</NewtonsoftJsonVersion>) are preserved too. Before this, the property got only the lower bound.
  • Transitive packages promoted with --transitive --upgrade are written as a plain version. Their range is the parent package's dependency constraint, not something the user declared.
  • Public API: IDotNetPackageService keeps its NuGetVersion overloads (it ships in DotNetOutdatedTool.Core), and the VersionRange overloads are added next to them. They are default interface methods, so existing implementers of IDotNetPackageService/IVariableTrackingService still compile. A plain version is written exactly as before (e.g. 4.5.0.0 is not normalized).
  • Directory.Packages.props formatting (Preserve whitespace in Directory.Packages.props during upgrades #803): the formatting replay and the --no-restore writer receive the same range text as dotnet add package -v, so ranges keep the file's layout. With --no-restore, a property-backed central version that can't be written now reports a failure instead of a silent success.
  • --maximum-version: since Fix: Parameter --maximum-version ignores exact version references #671, --maximum-version only narrows a declared range, so the last paragraph of the original description no longer applies. For example, [6.0.0, 10.0.0) with -mv 8.0 becomes [8.0.x, 10.0.0), and [6.0.13,7) stays within 7.0.0. The plain-version fallback remains as a safety net.
  • MCP update_package still takes an exact version. Accepting ranges let (,14.0.0) blank a version property.
  • The range calculation is extracted into UpgradeVersionRange.Compute, with offline unit tests. Added E2E tests for property ranges and CPM (with and without --no-restore). The README documents the behaviour.

Not changed: floating versions (6.*) are still replaced by a plain version, as described above. With --pre-release Always, a range like [9.0.0,10.0.0) can pick 10.0.0-rc.x, because NuGet treats it as inside the range. That selection happens in analysis and already happens on master, so it is left for a separate change.

🤖 Generated with Claude Code

slang25 and others added 8 commits November 8, 2026 11:58
Restores the original indentation and trailing whitespace in Program.cs,
McpServer.cs, DotNetPackageService.cs and EndToEndTests.cs so the PR diff
only contains the version-range change and merges cleanly with master.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolves conflicts with variable tracking (dotnet-outdated#714), the CPM --no-restore
direct write (dotnet-outdated#713), file-based apps (dotnet-outdated#752/dotnet-outdated#755) and short TFM names (dotnet-outdated#750).
AddPackage now takes the VersionRange through all of master's new paths;
single-version paths use the range's lower bound for now (refined in
follow-up commits). Restores the System.Text.Json using needed by master's
tests and adapts DotNetPackageServiceTests to the new signature.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
IDotNetPackageService is public API in the DotNetOutdatedTool.Core package,
so replacing the NuGetVersion overloads broke callers. Keep them, forwarding
to the new VersionRange overloads, and write a plain minimum version exactly
as NuGetVersion.ToString() did (so 4.5.0.0 stays 4.5.0.0). Ranges without a
lower bound are rejected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tool is an explicit "set this version" call and its schema says
"Version to upgrade to". Parsing it as a VersionRange accepted '*',
'13.*' and '(,14.0.0)'; for a variable-backed reference the latter blanked
the MSBuild property while reporting success. Restore NuGetVersion parsing
and cover the rejection with tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Moves the inline range computation from Program.UpgradePackages into
UpgradeVersionRange.Compute and table-tests it offline: bounded, inclusive,
exclusive and open-minimum ranges, floats, plain versions, the
--maximum-version fallback, and a missing original range.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ckage

With --transitive --upgrade, the version range of a transitive dependency is
the parent package's nuspec constraint (e.g. AWSSDK.Core [3.7.0, 3.8.0) from
AWSSDK.S3), not something the user wrote. Write a plain version for those,
as before, and only preserve ranges on direct references.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When a PackageReference or PackageVersion uses Version="$(SomeVersion)",
the variable tracking restored the reference but wrote only the lower bound
into the property, so [12.0.1,13.0.0) still became 12.0.3. Add VersionRange
overloads to IVariableTrackingService and use them for the MSBuild paths
(file-based app variables only hold single versions and are unchanged).
The property value is now inserted literally rather than as a regex
replacement pattern.

Adds end-to-end tests for a range in a project property and for central
package management (literal and variable ranges, with and without
--no-restore).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
slang25 and others added 2 commits November 8, 2026 12:13
Brings in dotnet-outdated#671 (--maximum-version no longer widens declared ranges) and dotnet-outdated#771.
Conflicts were limited to EndToEndTests.cs; both sides' tests are kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… test the interplay

Since dotnet-outdated#671, --maximum-version only narrows a declared range, so a declared
upper bound is always kept when upgrading. Update the README and helper
comment, and add an end-to-end test upgrading with --maximum-version over
pins, bounded ranges and plain versions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 Changes recommended

With --no-restore, CPM upgrades leave local VersionOverride values unchanged while incorrectly modifying shared central constraints, and new abstract interface overloads break existing consumer implementations.

2 open issues
What changed in this PR

Preserves declared upper version bounds during package upgrades, addressing #388 across package references, MSBuild properties, and central package management.

Changes:

  • Carries original ranges through upgrade planning and computes the range to write.
  • Adds range-aware service overloads while retaining existing single-version overloads.
  • Documents the behavior and adds unit tests, end-to-end tests, and range-based fixtures.
File Description
test/​DotNetOutdated.Tests/​VariableTrackingServiceTests.cs Tests property range updates and plain-version formatting.
test/​DotNetOutdated.Tests/​UpgradeVersionRangeTests.cs Tests range calculation and transitive-package handling.
test/​DotNetOutdated.Tests/​McpServerTests.cs Tests exact-version acceptance and range rejection.
test/​DotNetOutdated.Tests/​EndToEndTests.cs Tests range upgrades, properties, and central management.
test/​DotNetOutdated.Tests/​DotNetPackageServiceTests.cs Tests range writing and existing version formatting.
test-projects/​version-range/​version-range.csproj Adds bounded package-reference fixtures.
test-projects/​version-range-variables/​version-range-variables.csproj Adds a property-backed range fixture.
test-projects/​version-range-cpm/​version-range-cpm.csproj Adds centrally managed package references.
test-projects/​version-range-cpm/​Directory.Packages.props Defines literal and property-backed central ranges.
src/​DotNetOutdated/​UpgradeVersionRange.cs Computes upgrade ranges while preserving applicable bounds.
src/​DotNetOutdated/​ProjectExtensions.cs Carries original ranges into upgrade references.
src/​DotNetOutdated/​Program.cs Passes computed ranges to package updates.
src/​DotNetOutdated/​PackageProjectReference.cs Stores each reference’s original range.
src/​DotNetOutdated/​Models/​AnalyzedProject.cs Exposes original ranges without changing JSON output.
src/​DotNetOutdated.Core/​VersionRangeExtensions.cs Formats ranges while retaining plain-version formatting.
src/​DotNetOutdated.Core/​Services/​VariableTrackingService.cs Adds range-aware property updates.
src/​DotNetOutdated.Core/​Services/​IDotNetPackageService.cs Adds public range overloads.
src/​DotNetOutdated.Core/​Services/​DotNetPackageService.cs Writes ranges through CLI and central-package paths.
README.md Documents range preservation and exceptions.

Review effort: Balanced

slang25 and others added 2 commits November 8, 2026 12:21
Copilot review: adding abstract members to IDotNetPackageService and
IVariableTrackingService breaks existing implementers in the published
DotNetOutdatedTool.Core package. The range overloads now have default
implementations: a plain minimum version is passed to the existing
NuGetVersion overload; other ranges are rejected (AddPackage throws
NotSupportedException, TryUpdatePackageVariable returns false). The built-in
services override them with full range support.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in dotnet-outdated#790 (surface package-upgrade stdout). Keeps both sides' MCP
tests, and points UpgradePackagesTests' AddPackage stub at the VersionRange
overload that UpgradePackages now calls.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in dotnet-outdated#783 (multiline central package version updates). Keeps dotnet-outdated#783's
CentralPackageVersionUpdate result and regex, writing the version range
(VersionRange.ToVersionString) instead of a single version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟢 Approval recommended

No active review issues remain for the package-upgrade changes that preserve declared upper version bounds.

No open issues 🎉

2 resolved since last review

Review effort: Balanced

slang25 and others added 3 commits November 8, 2026 12:41
Brings in dotnet-outdated#793 (versioned MSBuild project SDKs). Takes master's
line-ending-normalised ProjectExtensions.cs and re-applies the
OriginalVersionRange plumbing; keeps both sides' tests. Project SDK
versions are single versions, so dotnet-outdated#793's SDK path uses the range's lower
bound.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings in dotnet-outdated#803 (preserve whitespace in Directory.Packages.props). The
formatting replay and the --no-restore writer now receive the same range
text that is passed to `dotnet add package -v` (VersionRange.ToVersionString),
so a range written by the CLI keeps the file's original layout.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…atting

Covers both the restore path (formatting replay after `dotnet add package`)
and the --no-restore path with a range value.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ptr727-codegen Bot pushed a commit to ptr727/LanguageTags that referenced this pull request Nov 10, 2026
Updated
[dotnet-outdated-tool](https://github.com/dotnet-outdated/dotnet-outdated)
from 4.8.1 to 4.9.0.

<details>
<summary>Release notes</summary>

_Sourced from [dotnet-outdated-tool's
releases](https://github.com/dotnet-outdated/dotnet-outdated/releases)._

## 4.9.0

## What's Changed
* Adopt MCP 2026-07-28 spec with legacy version negotiation by @​slang25
in dotnet-outdated/dotnet-outdated#772
* Fix concurrent cache corruption during recursive file-based app
upgrades by @​DamianEdwards in
dotnet-outdated/dotnet-outdated#788
* Fix: Parameter --maximum-version ignores exact version references by
@​chefarbeiter in
dotnet-outdated/dotnet-outdated#671
* Show a friendly message instead of crashing when a solution has no
projects by @​DanielC000 in
dotnet-outdated/dotnet-outdated#771
* Surface package-upgrade stdout so failures are diagnosable by
@​timabell in
dotnet-outdated/dotnet-outdated#790
* Fix multiline central package version updates by @​onuracar-dev in
dotnet-outdated/dotnet-outdated#783
* Support versioned MSBuild project SDKs in project files by @​thomhurst
in dotnet-outdated/dotnet-outdated#793
* Preserve whitespace in Directory.Packages.props during upgrades by
@​symbiogenesis in
dotnet-outdated/dotnet-outdated#803
* Treat package references injected by custom SDKs as auto-referenced by
@​thomhurst in
dotnet-outdated/dotnet-outdated#795
* Preserve version ranges when upgrading packages by @​GREsau in
dotnet-outdated/dotnet-outdated#702
* Preserve MSBuild version variables across project and props files by
@​symbiogenesis in
dotnet-outdated/dotnet-outdated#805
* Replace McMaster command-line parsing with System.CommandLine by
@​slang25 in dotnet-outdated/dotnet-outdated#808
* Bump version to 4.9.0 by @​slang25 in
dotnet-outdated/dotnet-outdated#806

## New Contributors
* @​chefarbeiter made their first contribution in
dotnet-outdated/dotnet-outdated#671
* @​DanielC000 made their first contribution in
dotnet-outdated/dotnet-outdated#771
* @​timabell made their first contribution in
dotnet-outdated/dotnet-outdated#790
* @​onuracar-dev made their first contribution in
dotnet-outdated/dotnet-outdated#783
* @​thomhurst made their first contribution in
dotnet-outdated/dotnet-outdated#793
* @​GREsau made their first contribution in
dotnet-outdated/dotnet-outdated#702

**Full Changelog**:
dotnet-outdated/dotnet-outdated@v4.8.1...v4.9.0


Commits viewable in [compare
view](dotnet-outdated/dotnet-outdated@v4.8.1...v4.9.0).
</details>

Updated [ptr727.Utilities](https://github.com/ptr727/Utilities) from
4.1.105 to 4.1.109.

<details>
<summary>Release notes</summary>

_Sourced from [ptr727.Utilities's
releases](https://github.com/ptr727/Utilities/releases)._

## 4.1.109

## What's Changed
* Bump the actions-deps group with 4 updates by @​dependabot[bot] in
ptr727/Utilities#574
* Bump the nuget-deps group with 2 updates by @​dependabot[bot] in
ptr727/Utilities#576
* Resync the Instruction Set With the Hub by @​ptr727 in
ptr727/Utilities#581
* Resync the Skills Tree and Markdownlint Config With the Hub by
@​ptr727 in ptr727/Utilities#578
* Bring the Publisher Concurrency and Aggregator Name to the Workflow
Contract by @​ptr727 in ptr727/Utilities#579
* Reconcile the Intent-Fidelity Carried Files With the Hub by @​ptr727
in ptr727/Utilities#580
* Promote the Hub Resync to Main by @​ptr727 in
ptr727/Utilities#582


**Full Changelog**:
ptr727/Utilities@4.1.108...4.1.109

## 4.1.108

## What's Changed
* Bump the actions-deps group with 4 updates by @​dependabot[bot] in
ptr727/Utilities#575
* Bump the nuget-deps group with 2 updates by @​dependabot[bot] in
ptr727/Utilities#577


**Full Changelog**:
ptr727/Utilities@4.1.105...4.1.108

Commits viewable in [compare
view](ptr727/Utilities@4.1.105...4.1.109).
</details>

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
ptr727 added a commit to ptr727/NxWitness that referenced this pull request Nov 11, 2026
Updated [csharpier](https://github.com/belav/csharpier) from 1.3.0 to
1.4.0.

<details>
<summary>Release notes</summary>

_Sourced from [csharpier's
releases](https://github.com/belav/csharpier/releases)._

## 1.4.0

## Breaking Changes
### Drop support for net8.0 and net9.0
[#​1888](belav/csharpier#1888)
CSharpier and CSharpier.MsBuild now target `net10.0` and `net11.0`.
CSharpier.Core targets `net10.0`, `net11.0` and `netstandard2.0`.

## What's Changed
### Feature: Support for .NET 11 and C# 15
[#​1888](belav/csharpier#1888)
CSharpier now supports the new syntax in C# 15.
```c#
public union Pet(Cat, Dog, Bird);

public closed record GateState;

HashSet<string> set = [with(StringComparer.OrdinalIgnoreCase), "Hello", "HELLO", "hello"];

outer:
for (int row = 0; row < grid.Height; row++)
{
    for (int column = 0; column < grid.Width; column++)
    {
        if (grid[row, column].IsBlocked)
        {
            continue outer;
        }

        if (grid[row, column].IsGoal)
        {
            break outer;
        }
    }
}
```

### Feature: Avoid chopping single trailing lambda
[#​1865](belav/csharpier#1865)
When the last argument is a lambda with a block body, and the arguments
up to and including the `=>` fit on one line, CSharpier now keeps them
on the same line as the method name.
```c#
// input & expected output
logging.AddFile(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "server{0}.log"), o =>
{
    o.MaxRollingFiles = 1;
});

// 1.3.0
logging.AddFile(
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "server{0}.log"),
    o =>
    {
        o.MaxRollingFiles = 1;
    }
);
```
 ... (truncated)

## 1.3.11-beta1



## 1.3.6

# 1.3.6
## What's Changed
#### Fix bug where 2nd instance of VSCode was not able to format code
[#​784](belav/csharpier#784)

Thanks to @​BenasB for reporting the issue

Commits viewable in [compare
view](belav/csharpier@1.3.0...1.4.0).
</details>

Updated
[dotnet-outdated-tool](https://github.com/dotnet-outdated/dotnet-outdated)
from 4.8.1 to 4.9.0.

<details>
<summary>Release notes</summary>

_Sourced from [dotnet-outdated-tool's
releases](https://github.com/dotnet-outdated/dotnet-outdated/releases)._

## 4.9.0

## What's Changed
* Adopt MCP 2026-07-28 spec with legacy version negotiation by @​slang25
in dotnet-outdated/dotnet-outdated#772
* Fix concurrent cache corruption during recursive file-based app
upgrades by @​DamianEdwards in
dotnet-outdated/dotnet-outdated#788
* Fix: Parameter --maximum-version ignores exact version references by
@​chefarbeiter in
dotnet-outdated/dotnet-outdated#671
* Show a friendly message instead of crashing when a solution has no
projects by @​DanielC000 in
dotnet-outdated/dotnet-outdated#771
* Surface package-upgrade stdout so failures are diagnosable by
@​timabell in
dotnet-outdated/dotnet-outdated#790
* Fix multiline central package version updates by @​onuracar-dev in
dotnet-outdated/dotnet-outdated#783
* Support versioned MSBuild project SDKs in project files by @​thomhurst
in dotnet-outdated/dotnet-outdated#793
* Preserve whitespace in Directory.Packages.props during upgrades by
@​symbiogenesis in
dotnet-outdated/dotnet-outdated#803
* Treat package references injected by custom SDKs as auto-referenced by
@​thomhurst in
dotnet-outdated/dotnet-outdated#795
* Preserve version ranges when upgrading packages by @​GREsau in
dotnet-outdated/dotnet-outdated#702
* Preserve MSBuild version variables across project and props files by
@​symbiogenesis in
dotnet-outdated/dotnet-outdated#805
* Replace McMaster command-line parsing with System.CommandLine by
@​slang25 in dotnet-outdated/dotnet-outdated#808
* Bump version to 4.9.0 by @​slang25 in
dotnet-outdated/dotnet-outdated#806

## New Contributors
* @​chefarbeiter made their first contribution in
dotnet-outdated/dotnet-outdated#671
* @​DanielC000 made their first contribution in
dotnet-outdated/dotnet-outdated#771
* @​timabell made their first contribution in
dotnet-outdated/dotnet-outdated#790
* @​onuracar-dev made their first contribution in
dotnet-outdated/dotnet-outdated#783
* @​thomhurst made their first contribution in
dotnet-outdated/dotnet-outdated#793
* @​GREsau made their first contribution in
dotnet-outdated/dotnet-outdated#702

**Full Changelog**:
dotnet-outdated/dotnet-outdated@v4.8.1...v4.9.0


Commits viewable in [compare
view](dotnet-outdated/dotnet-outdated@v4.8.1...v4.9.0).
</details>

Updated
[Microsoft.Extensions.Http.Resilience](https://github.com/dotnet/extensions)
from 10.11.0 to 11.0.0.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.Extensions.Http.Resilience's
releases](https://github.com/dotnet/extensions/releases)._

## 11.0.0

<!-- DRAFT: not published. Public baseline
f8ee27151b21e33793164b39de5bcebfdced81a4 (includes #​7923). Official
build source/tag target c60d72e7973a90cd4e4300d9153e97b93315e4b7 =
baseline + 9 internal release-prep commits (infrastructure, .NET
8/9/10/11 dependency updates, test pins, feeds, SDK 11.0.100 pin); no
additional PRs. Official build 3132207, BAR 340823, final published
manifest SHA256
A694CB054BBD836E73E2EF9EFA26FAD025EC6F709273D4CF217E08F5E1DE5CE6.
c60d72e is publicly reachable. -->
<!-- AVAILABILITY STATUS (2026-11-10): Public SDK 11.0.100 GA/download
and servicing 8.0.34/9.0.23/10.0.15 are confirmed available. Three
successful dotnet-public reads at 16:50:57Z, 17:05:36Z, and 17:20:30Z
found neither Microsoft.WindowsDesktop.App.Runtime.win-x64 8.0.34 nor
9.0.23 listed. The index samples do not establish restore, official CI,
or dependency closure. -->
<!-- VALIDATION STATUS (NOT PASSED): All 55 published package listings,
provenance/content and signatures were verified, as were 900
library/analyzer consumer graphs. The user's BAR readback confirms build
340823 in .NET 11 channel 8297. Published-source commit
c60d72e7973a90cd4e4300d9153e97b93315e4b7 is publicly reachable. All 272
selected library PDBs on msdl matched the original identities and bytes.
Website follow-up is user-deferred. -->

Version 11.0.0 ships alongside .NET 11 and with net11 targets added to
packages. Highlights of this release include new experimental Documents
and Document Extraction abstractions, metric instrument descriptions,
and a sliding-window retry budget for HTTP resilience.

## Experimental API Changes

### Now Stable
* HTTP server latency telemetry (`AddHttpServerLatencyTelemetry`) APIs
are now stable (previously `EXTEXP0013`) #​7898

### New Experimental APIs
* New experimental API: Documents abstractions in the new
`Microsoft.Extensions.Documents.Abstractions` package (`EXTEXP0019`)
#​7835
* New experimental API: Document Extraction in the new
`Microsoft.Extensions.DocumentExtraction` and
`Microsoft.Extensions.DocumentExtraction.Abstractions` packages
(`MEDE0001`) #​7588
* New experimental API: HTTP resilience retry budget
(`HttpRetryBudgetOptions`,
`HttpRetryResiliencePipelineBuilderExtensions`,
`OnRetryBudgetExhaustedArguments`) (`EXTEXP0001`) #​7867
* New experimental API: `Description` on metric attributes
(`EXTEXP0003`) #​7837

### Obsoleted APIs
* `HybridCacheOptions.DisableCompression` is now obsolete (`EXTOBS0003`)
#​7885

## What's Changed

### Telemetry and Logging

* Add Description to metric attributes and describe all instruments
#​7837 by @​evgenyfedorov2 (co-authored by @​Copilot)
* Capture trace context, thread ID and message template in buffered logs
#​7818 by @​evgenyfedorov2 (co-authored by @​Copilot)
* Allow bool and numeric types for strongly-typed metric tags #​7877 by
@​evgenyfedorov2 (co-authored by @​Copilot)
* Fix route parameter redaction when a parameter value contains a
delimiter used later in the same path segment #​7828 by @​evgenyfedorov2
(co-authored by @​Copilot)
* Fix lost log records when logging reentrantly on the same thread
#​7847 by @​evgenyfedorov2 (co-authored by @​Copilot)
* Fix logging generator stack overflow on type cycles #​7861 by
@​evgenyfedorov2 (co-authored by @​Copilot)
* Honor `[LogPropertyIgnore]` during transitive logging and
`[LogProperties(Transitive = true)]` on properties #​7868 by
@​evgenyfedorov2 (co-authored by @​Copilot)
* Make DataClassificationSet static to decrease allocations #​7874 by
@​evgenyfedorov2 (co-authored by @​Copilot)

### Caching

* Add HybridCache.GetOrCreateAsync overloads for dynamic setting of
options #​7568 by @​svick (co-authored by @​Copilot)
* Mark HybridCacheOptions.DisableCompression as obsolete #​7885 by
@​slang25
* Fix HybridCache stampede state removal race #​7814 by @​svick
(co-authored by @​Copilot)
* Fix HybridCache reservation over-release on DisableUnderlyingData miss
#​7879 by @​Eng3bbas

### AI

* AI: Restore neutral tool approval rejection message #​7913 by @​jozkee
(co-authored by @​Copilot)
* Fix ImageGenerationOptions.Clone dropping StreamingCount #​7829 by
@​Empiree
* Fix evaluation context serialization without reflection fallback
#​7869 by @​valkiara
* Pin MessagePack 2.5.307 in AI template AppHost project #​7853 by
@​evgenyfedorov2 (co-authored by @​Copilot)

### Packaging and Target Frameworks

* Condition framework-provided package references for .NET 11 #​7915 by
@​jeffhandley (co-authored by @​Copilot)
 ... (truncated)

Commits viewable in [compare
view](dotnet/extensions@v10.11.0...v11.0.0).
</details>

Updated [Microsoft.NET.Test.Sdk](https://github.com/microsoft/vstest)
from 18.11.0 to 18.12.0.

<details>
<summary>Release notes</summary>

_Sourced from [Microsoft.NET.Test.Sdk's
releases](https://github.com/microsoft/vstest/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/microsoft/vstest/commits).
</details>

Updated [System.CommandLine](https://github.com/dotnet/dotnet) from
2.0.14 to 3.0.0.

<details>
<summary>Release notes</summary>

_Sourced from [System.CommandLine's
releases](https://github.com/dotnet/dotnet/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/dotnet/dotnet/commits).
</details>

Updated [xunit.analyzers](https://github.com/xunit/xunit.analyzers) from
2.2.0 to 2.3.0.

<details>
<summary>Release notes</summary>

_Sourced from [xunit.analyzers's
releases](https://github.com/xunit/xunit.analyzers/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/xunit/xunit.analyzers/commits).
</details>

Updated [xunit.v3](https://github.com/xunit/xunit) from 4.0.2 to 4.0.3.

<details>
<summary>Release notes</summary>

_Sourced from [xunit.v3's
releases](https://github.com/xunit/xunit/releases)._

No release notes found for this version range.

Commits viewable in [compare
view](https://github.com/xunit/xunit/commits).
</details>

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Pieter Viljoen <ptr727@users.noreply.github.com>
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Version ranges are not preserved when upgrading packages

3 participants