Update NuGet dependencies (#4536)

## Summary

- update NuGet dependencies to their latest compatible stable releases
while retaining documented compatibility, native, security, and mocking
pins
- align the nbgv CLI with the central `Nerdbank.GitVersioning` version
(3.10.94) and fail explicitly on tool installation/update errors
- update the synchronized OpenUSD family to `0.14.0-alpha`; adapt the
Vision blank-frame fixture to the new `RenderDiagnosticsState`
constructor argument
- retain `Microsoft.CodeAnalysis` API packages at the existing 5.0/4.14
host bands: Roslyn 5.9 requires Immutable/Metadata 10.0.1+, while the
retained older compiler-host closure is intentionally pinned to 9.0.0

## Dependency updates

- `Dekaf` 1.17.0 → 1.21.1
- legacy ASP.NET Core 2.3 dependencies → 2.3.13; net8/net9
authentication and WebApi test packages → 8.0.31/9.0.20
- `Microsoft.CodeAnalysis.Analyzers` 4.14.0 → 5.9.0
- `TUnit` 1.68.0 → 1.69.0
- `Avalonia` / `Avalonia.Desktop` 12.1.2 → 12.1.3
- schema-test `System.Collections.Immutable` overrides 10.0.11 → 10.0.12
- `AzureSignTool` 3.0.0 → 7.0.1 and `NuGetKeyVaultSignTool` 3.0.45 →
3.2.3
- eight direct OpenUSD packages 0.12.0-alpha → 0.14.0-alpha

## Validation

- `dotnet restore UA.slnx --disable-parallel`
- clean `UA.slnx` Release build with `CustomTestTarget=net10.0`
- `UA.slnx` Release builds with `net48` and `netstandard2.1`
- OpenUSD and Vision test suites on net8/net9/net10: 882/882/921 and 484
passed + 1 environment skip on each target
- full `Opc.Ua.Tools.Tests` net10.0: 963 passed, 1 skipped
- source-generator package validation against a locally packed release
package set
- updated signing tools installed in an isolated directory; existing
`sign` CLI options verified without credentials
- nbgv 3.10.94 bootstrap exercised in simulated GitHub CI; disposable
committed fixture verified canonical and case-invalid release refs with
a four-component version

## Limits

No protected signing/publication, Linux/macOS native rendering, or full
stress/nightly suites were run locally.
This commit is contained in:
Marc Schier
2026-09-24 07:19:09 -07:00
committed by GitHub
parent 490d15cb20
commit 23be306c65
13 changed files with 142 additions and 50 deletions
+2 -2
View File
@@ -62,13 +62,13 @@ jobs:
inputs:
command: 'custom'
custom: 'tool'
arguments: 'install --version 3.0.0 --tool-path . azuresigntool'
arguments: 'install --version 7.0.1 --tool-path . azuresigntool'
displayName: Install AzureSignTool
- task: DotNetCoreCLI@2
inputs:
command: 'custom'
custom: 'tool'
arguments: 'install --version 3.0.45 --tool-path . NuGetKeyVaultSignTool'
arguments: 'install --version 3.2.3 --tool-path . NuGetKeyVaultSignTool'
displayName: Install NuGetKeyVaultSignTool
- task: NuGetToolInstaller@1
inputs:
+39 -6
View File
@@ -7,11 +7,44 @@
the rest of the build system.
#>
# Try install tool
# Note: Keep Version 3.7.115, it is known working for 4 digit versioning
& dotnet @("tool", "install", "--tool-path", "./tools", "--version", "3.7.115", "--framework", "net80", "nbgv") 2>&1
# Keep the CLI and the MSBuild package on the same explicit version. A version
# range or omitted --version would make otherwise identical CI runs use
# different nbgv behavior as releases appear on nuget.org.
[xml]$centralPackages = Get-Content -LiteralPath './Directory.Packages.props' -Raw
$nbgvVersions = @($centralPackages.Project.ItemGroup.PackageVersion |
Where-Object { $_.Include -eq 'Nerdbank.GitVersioning' } |
ForEach-Object { $_.Version })
if ($nbgvVersions.Count -ne 1 -or [string]::IsNullOrWhiteSpace($nbgvVersions[0])) {
throw 'Directory.Packages.props must declare exactly one Nerdbank.GitVersioning version.'
}
$props = (& ./tools/nbgv @("get-version", "-f", "json")) | ConvertFrom-Json
$nbgvVersion = $nbgvVersions[0]
if ($nbgvVersion -notmatch '^\d+\.\d+\.\d+$') {
throw "Nerdbank.GitVersioning version '$nbgvVersion' must be an explicit stable version."
}
$toolPath = './tools'
$toolExecutable = Join-Path $toolPath 'nbgv'
if ([System.Environment]::OSVersion.Platform -eq [System.PlatformID]::Win32NT) {
$toolExecutable += '.exe'
}
$toolCommand = if (Test-Path -LiteralPath $toolExecutable) { 'update' } else { 'install' }
& dotnet @(
'tool',
$toolCommand,
'--tool-path',
$toolPath,
'--version',
$nbgvVersion,
'--framework',
'net10.0',
'nbgv') 2>&1
if ($LastExitCode -ne 0) {
throw "Failed to $toolCommand nbgv $nbgvVersion (exit code $LastExitCode)."
}
$props = (& $toolExecutable @("get-version", "-f", "json")) | ConvertFrom-Json
if ($LastExitCode -ne 0) {
throw "Error: 'nbgv get-version -f json' failed with $($LastExitCode)."
}
@@ -28,11 +61,11 @@ $version = [pscustomobject] @{
# Call versioning for build
if ($version.Public -eq 'True')
{
& ./tools/nbgv @("cloud", "-c", "-a", "-v", "$($version.Full)$($version.Pre)")
& $toolExecutable @("cloud", "-c", "-a", "-v", "$($version.Full)$($version.Pre)")
}
else
{
& ./tools/nbgv @("cloud", "-c", "-a")
& $toolExecutable @("cloud", "-c", "-a")
}
if ($LastExitCode -ne 0) {
+2 -2
View File
@@ -100,11 +100,11 @@ jobs:
shell: pwsh
run: |
New-Item -ItemType Directory -Force -Path "$env:TOOLS_DIR" | Out-Null
dotnet tool install --version 3.0.0 --tool-path "$env:TOOLS_DIR" AzureSignTool
dotnet tool install --version 7.0.1 --tool-path "$env:TOOLS_DIR" AzureSignTool
if ($LASTEXITCODE -ne 0) {
throw 'AzureSignTool installation failed.'
}
dotnet tool install --version 3.0.45 --tool-path "$env:TOOLS_DIR" NuGetKeyVaultSignTool
dotnet tool install --version 3.2.3 --tool-path "$env:TOOLS_DIR" NuGetKeyVaultSignTool
if ($LASTEXITCODE -ne 0) {
throw 'NuGetKeyVaultSignTool installation failed.'
}
+29 -29
View File
@@ -20,7 +20,7 @@
<PackageVersion Include="coverlet.collector" Version="10.0.1" />
<PackageVersion Include="Crdt" Version="1.1.2" />
<PackageVersion Include="Crdt.Transport" Version="1.1.2" />
<PackageVersion Include="Dekaf" Version="1.17.0" />
<PackageVersion Include="Dekaf" Version="1.21.1" />
<PackageVersion Include="RaftCs" Version="1.1.2" />
<PackageVersion Include="RaftCs.Transport" Version="1.1.2" />
<PackageVersion Include="RaftCs.Transport.NanoMsg" Version="1.1.2" />
@@ -28,18 +28,18 @@
<PackageVersion Include="EmbedIO" Version="3.5.2" />
<PackageVersion Include="JsonSchema.Net" Version="9.4.0" />
<PackageVersion Include="Makaretu.Dns.Multicast" Version="0.27.0" />
<PackageVersion Include="Microsoft.AspNetCore.Connections.Abstractions" Version="2.3.12" />
<PackageVersion Include="Microsoft.AspNetCore.Hosting" Version="2.3.12" />
<PackageVersion Include="Microsoft.AspNetCore.Http" Version="2.3.12" />
<PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.3.12" />
<PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel.Core" Version="2.3.12" />
<PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel.Https" Version="2.3.12" />
<PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" Version="2.3.12" />
<PackageVersion Include="Microsoft.AspNetCore.WebSockets" Version="2.3.12" />
<PackageVersion Include="Microsoft.AspNetCore.Connections.Abstractions" Version="2.3.13" />
<PackageVersion Include="Microsoft.AspNetCore.Hosting" Version="2.3.13" />
<PackageVersion Include="Microsoft.AspNetCore.Http" Version="2.3.13" />
<PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel" Version="2.3.13" />
<PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel.Core" Version="2.3.13" />
<PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel.Https" Version="2.3.13" />
<PackageVersion Include="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" Version="2.3.13" />
<PackageVersion Include="Microsoft.AspNetCore.WebSockets" Version="2.3.13" />
<PackageVersion Include="Microsoft.Bcl.HashCode" Version="6.0.0" />
<PackageVersion Include="Microsoft.Bcl.AsyncInterfaces" Version="10.0.12" />
<PackageVersion Include="Microsoft.Bcl.TimeProvider" Version="10.0.12" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="4.14.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="5.9.0" />
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="$(RoslynApiVersionVS2026)" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="$(RoslynApiVersionVS2026)" />
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="$(RoslynApiVersionVS2026)" />
@@ -79,7 +79,7 @@
<PackageVersion Include="System.CommandLine" Version="2.0.12" />
<PackageVersion Include="Microsoft.VisualStudio.DiagnosticsHub.BenchmarkDotNetDiagnosers" Version="18.7.37220.1" />
<PackageVersion Include="Moq" Version="4.20.72" />
<PackageVersion Include="TUnit" Version="1.68.0" />
<PackageVersion Include="TUnit" Version="1.69.0" />
<PackageVersion Include="Nerdbank.GitVersioning" Version="3.10.94" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<!--
@@ -152,16 +152,16 @@
match; a partial bump fails when the natives load rather than when the
solution builds. -->
<ItemGroup>
<PackageVersion Include="OpenUsd" Version="0.12.0-alpha" />
<PackageVersion Include="OpenUsd.Viewer" Version="0.12.0-alpha" />
<PackageVersion Include="OpenUsd.Rendering" Version="0.12.0-alpha" />
<PackageVersion Include="OpenUsd.Rendering.Silk" Version="0.12.0-alpha" />
<PackageVersion Include="OpenUsd.Rendering.Silk.D3D12" Version="0.12.0-alpha" />
<PackageVersion Include="OpenUsd.Rendering.Silk.Vulkan" Version="0.12.0-alpha" />
<PackageVersion Include="OpenUsd.Runtime.Core" Version="0.12.0-alpha" />
<PackageVersion Include="OpenUsd.Runtime.Imaging" Version="0.12.0-alpha" />
<PackageVersion Include="Avalonia" Version="12.1.2" />
<PackageVersion Include="Avalonia.Desktop" Version="12.1.2" />
<PackageVersion Include="OpenUsd" Version="0.14.0-alpha" />
<PackageVersion Include="OpenUsd.Viewer" Version="0.14.0-alpha" />
<PackageVersion Include="OpenUsd.Rendering" Version="0.14.0-alpha" />
<PackageVersion Include="OpenUsd.Rendering.Silk" Version="0.14.0-alpha" />
<PackageVersion Include="OpenUsd.Rendering.Silk.D3D12" Version="0.14.0-alpha" />
<PackageVersion Include="OpenUsd.Rendering.Silk.Vulkan" Version="0.14.0-alpha" />
<PackageVersion Include="OpenUsd.Runtime.Core" Version="0.14.0-alpha" />
<PackageVersion Include="OpenUsd.Runtime.Imaging" Version="0.14.0-alpha" />
<PackageVersion Include="Avalonia" Version="12.1.3" />
<PackageVersion Include="Avalonia.Desktop" Version="12.1.3" />
</ItemGroup>
<!-- MQTTnet 5.x dropped net48/net472/netstandard2.1 support. Per-TFM pinning is
required because CentralPackageTransitivePinningEnabled lets the central pin
@@ -189,16 +189,16 @@
- a future net11.0, or the net10.0 shell that the legacy netstandard2.0/2.1
$(CustomTestTarget) builds fall back to - still resolves a version. -->
<ItemGroup Condition="'$(TargetFramework)' == 'net8.0'">
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Certificate" Version="8.0.30" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.30" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.30" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="8.0.30" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Certificate" Version="8.0.31" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.31" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="8.0.31" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="8.0.31" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' == 'net9.0'">
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Certificate" Version="9.0.19" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.19" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.19" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="9.0.19" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Certificate" Version="9.0.20" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.20" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.20" />
<PackageVersion Include="Microsoft.AspNetCore.TestHost" Version="9.0.20" />
</ItemGroup>
<ItemGroup Condition="'$(TargetFramework)' != 'net8.0' AND '$(TargetFramework)' != 'net9.0'">
<PackageVersion Include="Microsoft.AspNetCore.Authentication.Certificate" Version="10.0.12" />
@@ -119,7 +119,7 @@ namespace Opc.Ua.Client.ComplexTypes.Tests
[DatapointSource]
public StructureType[] StructureTypes =
#if NET8_0_OR_GREATER && !NET_STANDARD_TESTS
#if NET8_0_OR_GREATER
Enum.GetValues<StructureType>();
#else
(StructureType[])Enum.GetValues(typeof(StructureType));
@@ -120,7 +120,7 @@ namespace Opc.Ua.Client.ComplexTypes.Tests.Types
[DatapointSource]
public StructureType[] StructureTypes =
#if NET8_0_OR_GREATER && !NET_STANDARD_TESTS
#if NET8_0_OR_GREATER
Enum.GetValues<StructureType>();
#else
(StructureType[])Enum.GetValues(typeof(StructureType));
@@ -129,7 +129,7 @@ namespace Opc.Ua.Client.ComplexTypes.Tests.Types
[DatapointSource]
public static readonly TestType[] TypeSource = new TestTypeCollection(
#if NET8_0_OR_GREATER && !NET_STANDARD_TESTS
#if NET8_0_OR_GREATER
Enum.GetValues<BuiltInType>()
#else
Enum.GetValues(typeof(BuiltInType))
@@ -27,7 +27,7 @@
<!-- JsonSchema.Net transitively requires System.Collections.Immutable >= 10.0.5, while the
central pin tracks the Roslyn band's runtime version for the analyzer closure
(see roslyn.props). Test projects are not part of that closure, so override here. -->
<PackageReference Include="System.Collections.Immutable" VersionOverride="10.0.11" />
<PackageReference Include="System.Collections.Immutable" VersionOverride="10.0.12" />
</ItemGroup>
<ItemGroup>
<Compile Include="..\Common\Main.cs" />
@@ -186,7 +186,7 @@ namespace Opc.Ua.Core.TestFramework
[DatapointSource]
public static readonly BuiltInType[] BuiltInTypes =
#if NET8_0_OR_GREATER && !NET_STANDARD_TESTS
#if NET8_0_OR_GREATER
[
.. Enum.GetValues<BuiltInType>()
#else
@@ -204,7 +204,7 @@ namespace Opc.Ua.Core.TestFramework
[DatapointSource]
public static readonly EncodingType[] EncoderTypes =
#if NET8_0_OR_GREATER && !NET_STANDARD_TESTS
#if NET8_0_OR_GREATER
Enum.GetValues<EncodingType>();
#else
(EncodingType[])Enum.GetValues(typeof(EncodingType));
@@ -98,7 +98,7 @@ namespace Opc.Ua.Core.Tests.Types.BuiltIn
[DatapointSource]
public static readonly BuiltInType[] BuiltInTypes =
#if NET8_0_OR_GREATER && !NET_STANDARD_TESTS
#if NET8_0_OR_GREATER
[
.. Enum.GetValues<BuiltInType>()
#else
@@ -14,7 +14,7 @@
<!-- JsonSchema.Net transitively requires System.Collections.Immutable >= 10.0.5, while the
central pin tracks the Roslyn band's runtime version for the analyzer closure
(see roslyn.props). Test projects are not part of that closure, so override here. -->
<PackageReference Include="System.Collections.Immutable" VersionOverride="10.0.11" />
<PackageReference Include="System.Collections.Immutable" VersionOverride="10.0.12" />
<PackageReference Include="Microsoft.NET.Test.Sdk" />
<PackageReference Include="Moq" />
<PackageReference Include="NUnit" />
@@ -38,6 +38,7 @@ using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
using System.Xml.Linq;
using NUnit.Framework;
namespace Opc.Ua.Tools.Tests
@@ -892,6 +893,61 @@ namespace Opc.Ua.Tools.Tests
});
}
[Test]
public void NbgvCliUsesTheCentralPackageVersion()
{
string root = FindRepositoryRoot();
XDocument packages = XDocument.Load(Path.Combine(root, "Directory.Packages.props"));
string? version = packages
.Descendants("PackageVersion")
.SingleOrDefault(element =>
string.Equals(
(string?)element.Attribute("Include"),
"Nerdbank.GitVersioning",
StringComparison.Ordinal))
?.Attribute("Version")
?.Value;
string script = File.ReadAllText(Path.Combine(root, ".azurepipelines", "set-version.ps1"));
Assert.Multiple(() =>
{
Assert.That(version, Is.EqualTo("3.10.94"));
Assert.That(
script,
Does.Contain("$centralPackages.Project.ItemGroup.PackageVersion"),
"The CLI must derive its exact version from central package management.");
Assert.That(script, Does.Contain("'--framework'"));
Assert.That(script, Does.Contain("'net10.0'"));
Assert.That(script, Does.Not.Contain("3.7.115"));
Assert.That(
script,
Does.Contain("[System.Environment]::OSVersion.Platform -eq [System.PlatformID]::Win32NT"),
"Azure invokes this script through Windows PowerShell 5.1, which does not define $IsWindows.");
Assert.That(script, Does.Not.Contain("$IsWindows"));
});
}
[Test]
public void OpenUsdPackageFamilyUsesOneVerifiedPrerelease()
{
XDocument packages = XDocument.Load(Path.Combine(FindRepositoryRoot(), "Directory.Packages.props"));
string[] versions =
[
.. packages
.Descendants("PackageVersion")
.Where(element =>
((string?)element.Attribute("Include"))?.StartsWith("OpenUsd", StringComparison.Ordinal) == true)
.Select(element => (string?)element.Attribute("Version"))
.OfType<string>()
];
Assert.Multiple(() =>
{
Assert.That(versions, Has.Length.EqualTo(8));
Assert.That(versions, Is.All.EqualTo("0.14.0-alpha"));
});
}
private static string CreateTestPackage(string name, Dictionary<string, string> entries)
{
string directory = Path.Combine(
@@ -31,6 +31,7 @@ using System;
using System.Reflection;
using NUnit.Framework;
using Opc.Ua.Vision.OpenUsd.Rendering;
using OpenUsd.Rendering;
using OpenUsd.Rendering.Silk;
namespace Opc.Ua.Vision.Tests
@@ -215,12 +216,14 @@ namespace Opc.Ua.Vision.Tests
typeof(byte[]),
typeof(SilkMeshRenderResult),
typeof(ulong),
typeof(uint)
typeof(uint),
typeof(RenderDiagnosticsState)
},
modifiers: null);
Assert.That(ctor, Is.Not.Null,
"SilkFrameCaptureResult's internal (int,int,byte[],SilkMeshRenderResult,ulong,uint) constructor must exist for BlankFrameGuard tests to construct fixtures.");
return (SilkFrameCaptureResult)ctor!.Invoke(new object[] { width, height, rgba, render, 0UL, 0U });
"SilkFrameCaptureResult's internal capture constructor must exist for BlankFrameGuard tests to construct fixtures.");
return (SilkFrameCaptureResult)ctor!.Invoke(
new object[] { width, height, rgba, render, 0UL, 0U, RenderDiagnosticsState.Empty });
}
}
}