Skip to content

Upgrade to .NET 10#153

Merged
elzik merged 18 commits intomainfrom
upgrade-to-net10
Mar 9, 2026
Merged

Upgrade to .NET 10#153
elzik merged 18 commits intomainfrom
upgrade-to-net10

Conversation

@elzik
Copy link
Owner

@elzik elzik commented Dec 1, 2025

Summary by CodeRabbit

  • Chores

    • Upgraded solution and projects to .NET 10 / Visual Studio 18 and centralized package version management.
    • CI/CD adjusted to use the newer runtime and dynamic tooling versions; removed the previous tagging script.
  • Changes

    • Switched runtime logging to console and removed file-based sinks for app and functional tests.
    • Test toolchain and test projects updated for the new framework; installer/publish targets updated accordingly.

@coderabbitai
Copy link

coderabbitai bot commented Dec 1, 2025

Walkthrough

Upgrade solution and projects from .NET 8 to .NET 10, introduce centralized package versioning (Directory.Packages.props), make GitVersion.Tool installation version-driven via a new PowerShell module, remove Serilog file sink, adjust CI/build/installer scripts, and update test toolchain and functional tests.

Changes

Cohort / File(s) Summary
CI / global SDK
\.github/workflows/continuous-delivery.yml, global.json
Switch CI dotnet to 10.x; set global.json sdk.version → 10.0.100 and rollForwardminor.
Solution
Elzik.FmSync.sln
Bump solution header to Visual Studio v18 and re-add multiple projects and solution items.
Centralized package versions
Directory.Packages.props
Add central package-version management (ManagePackageVersionsCentrally = true) with PackageVersion entries for many packages (e.g., GitVersion.MsBuild, Microsoft.Extensions.*, xunit, Serilog, etc.).
GitVersion tool helper
Build/Get-GitVersionToolVersion.psm1
Add function to read GitVersion.MsBuild version from Directory.Packages.props for dynamic GitVersion.Tool installation.
Build scripts
Build/build-osx-installer.ps1, Build/build-windows-installer.ps1, Build/...
Update publish paths to net10.0; replace static dotnet tool update with module-driven GitVersion.Tool install using the new helper.
Removed script
Build/tag-with-semver.ps1
Remove GitVersion-based tagging script and its tagging/push logic.
Core projects
src/.../Elzik.FmSync.Application.csproj, src/.../Elzik.FmSync.Domain.csproj, src/.../Elzik.FmSync.Infrastructure.csproj
TargetFramework → net10.0; remove explicit Version attributes from multiple PackageReference entries (versions centralized).
Console app & config
src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj, src/Elzik.FmSync.Console/appSettings.json
Target → net10.0; remove explicit package Version attributes; remove Serilog File sink from appSettings.json (Console sink retained).
Worker project
src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj
Target → net10.0; remove explicit package versions; add NuGetAuditMode and Windows-specific IS_WINDOWS_OS define.
Installer project
Installer/Elzik.FmSync.WindowsInstaller/Elzik.FmSync.WindowsInstaller.wixproj
Update GitVersionTargetFramework → net10.0; remove explicit PackageReference versions (e.g., GitVersion.MsBuild, WixToolset.UI.wixext).
Test projects
tests/.../*.csproj, tests/Elzik.FmSync.Application.Tests.Unit/...
TargetFramework → net10.0; reorganize test/tooling packages: remove pinned versions, replace coverlet.collector with coverlet.msbuild, shift to xUnit/MSBuild-based tooling with central versions.
Console functional tests
tests/Elzik.FmSync.Console.Tests.Functional/ConsoleTests.cs
Remove file-logging setup and file-based assertions; tests now rely on console output only.
Worker functional tests & config
tests/Elzik.FmSync.Worker.Tests.Functional/WorkerTests.cs, tests/Elzik.FmSync.Worker.Tests.Functional/appSettings.json
Change expected log text; add using directives; wrap process-kill logic to catch Win32Exception and fail on "Access is denied."; update Serilog file sink path to logs/....
Dependabot
.github/dependabot.yml
Remove explicit rebase-strategy: auto for NuGet updates.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐇 I hopped from eight up to shiny ten,
Packages gathered, versions penned,
The file-sink gone, the console bright,
Scripts now read the version right,
A rabbit cheers — build on, this is zen!

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The pull request title 'Upgrade to .NET 10' directly and clearly summarizes the primary change across the entire changeset, which involves updating target frameworks, SDK versions, and tooling from .NET 8 to .NET 10.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch upgrade-to-net10

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.github/workflows/continuous-delivery.yml (1)

64-64: Windows build still uses .NET 8 SDK - should be updated to 10.x.x

The macOS build job (line 103) was updated to use dotnet-version: 10.x.x, but the Windows build job still uses 8.x.x. Since all projects now target net10.0, the Windows build will fail when trying to compile against the .NET 8 SDK.

Apply this diff to fix the inconsistency:

     - name: Setup .NET
       uses: actions/setup-dotnet@v4
       with:
-        dotnet-version: 8.x.x
+        dotnet-version: 10.x.x
🧹 Nitpick comments (2)
tests/Elzik.FmSync.Worker.Tests.Functional/WorkerTests.cs (1)

7-8: Unused import detected.

Microsoft.VisualStudio.TestPlatform.CommunicationUtilities (line 8) appears to be unused in this file. While System.ComponentModel is needed for Win32Exception, the TestPlatform import doesn't seem to have any references.

 using System.ComponentModel;
-using Microsoft.VisualStudio.TestPlatform.CommunicationUtilities;
src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj (1)

29-29: Remove unused Serilog.Sinks.File package reference.

The package is not configured in appSettings.json (only Console sink is used) and has no references in the codebase, making it safe to remove from the project dependencies.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4e59d12 and 661e828.

📒 Files selected for processing (16)
  • .github/workflows/continuous-delivery.yml (2 hunks)
  • Elzik.FmSync.sln (2 hunks)
  • global.json (1 hunks)
  • src/Elzik.FmSync.Application/Elzik.FmSync.Application.csproj (2 hunks)
  • src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj (2 hunks)
  • src/Elzik.FmSync.Console/appSettings.json (1 hunks)
  • src/Elzik.FmSync.Domain/Elzik.FmSync.Domain.csproj (2 hunks)
  • src/Elzik.FmSync.Infrastructure/Elzik.FmSync.Infrastructure.csproj (2 hunks)
  • src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj (3 hunks)
  • tests/Elzik.FmSync.Application.Tests.Unit/Elzik.FmSync.Application.Tests.Unit.csproj (2 hunks)
  • tests/Elzik.FmSync.Console.Tests.Functional/ConsoleTests.cs (0 hunks)
  • tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj (2 hunks)
  • tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj (2 hunks)
  • tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj (2 hunks)
  • tests/Elzik.FmSync.Worker.Tests.Functional/WorkerTests.cs (3 hunks)
  • tests/Elzik.FmSync.Worker.Tests.Functional/appSettings.json (1 hunks)
💤 Files with no reviewable changes (1)
  • tests/Elzik.FmSync.Console.Tests.Functional/ConsoleTests.cs
🧰 Additional context used
🪛 GitHub Actions: Continuous Delivery
global.json

[error] 1-1: Requested .NET SDK 10.0.100 not found. global.json points to 10.0.100; installed SDKs do not include it. Install the 10.0.100 SDK or update global.json.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: build-macos
  • GitHub Check: Codacy Static Code Analysis
  • GitHub Check: Analyze (csharp)
🔇 Additional comments (16)
.github/workflows/continuous-delivery.yml (2)

25-25: GitVersion.Tool update looks good.

The tool version is aligned with the GitVersion.MsBuild package version (6.5.1) used across project files.


103-103: macOS SDK update to 10.x.x is correct.

This aligns with the target framework upgrade to net10.0.

src/Elzik.FmSync.Domain/Elzik.FmSync.Domain.csproj (1)

4-4: Package and framework updates are consistent.

The target framework and package versions align with the broader .NET 10 upgrade across the solution.

Also applies to: 15-15, 19-19

src/Elzik.FmSync.Infrastructure/Elzik.FmSync.Infrastructure.csproj (1)

4-4: Infrastructure project updates are aligned with .NET 10.

The target framework, GitVersion, Microsoft.Extensions.Options, and SonarAnalyzer versions are consistent with the upgrade.

Also applies to: 15-15, 19-20

tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj (1)

4-4: Test project updates are consistent.

The target framework, test SDK, and analyzer packages are properly updated. The addition of PrivateAssets and IncludeAssets to xunit.analyzers correctly marks it as a development-only dependency.

Also applies to: 37-37, 39-47

tests/Elzik.FmSync.Application.Tests.Unit/Elzik.FmSync.Application.Tests.Unit.csproj (1)

4-4: Unit test project updates are well-structured.

The framework and package updates are consistent. The removal of explicit System.Net.Http and System.Text.RegularExpressions references (per the AI summary) is correct since these are included in the .NET 10 runtime.

Also applies to: 30-30, 36-46

src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj (1)

18-28: Package updates are consistent with .NET 10.

The Microsoft.Extensions.* packages (10.0.0) and Serilog packages are properly updated to versions compatible with .NET 10.

tests/Elzik.FmSync.Worker.Tests.Functional/WorkerTests.cs (2)

339-360: Good addition of exception handling for process cleanup.

The try-catch block around KillExistingWorkerProcesses properly handles Win32Exception and provides a clear failure message when permissions are insufficient. The pattern of catching a specific exception, handling the known case, and re-throwing otherwise is correct.


111-111: Test expectation updated to match startup sequence.

The change from "Hosting started" to "A total of 1 directory watchers are running." waits for a later point in the startup sequence, ensuring the worker is fully initialized before the test proceeds.

src/Elzik.FmSync.Application/Elzik.FmSync.Application.csproj (1)

4-4: Consistent .NET 10 upgrade applied.

The framework and package version updates are consistent with the Worker project upgrade, maintaining alignment across the solution.

Also applies to: 15-22

Elzik.FmSync.sln (1)

28-41: Solution structure reorganized correctly.

The project entries have been properly restructured with correct GUIDs and paths maintained throughout the configuration sections.

src/Elzik.FmSync.Console/appSettings.json (1)

9-13: Simplified logging configuration for console application.

Removing file-based logging in favor of console-only output is appropriate for a console application, simplifying the configuration and aligning with typical console app patterns.

tests/Elzik.FmSync.Worker.Tests.Functional/appSettings.json (1)

21-21: Simplified test log path configuration.

The change from a platform-specific placeholder to a relative path simplifies the test configuration and makes it more maintainable.

tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj (1)

4-4: Test project properly upgraded to .NET 10.

The framework and test tooling updates are consistent with the solution-wide upgrade. The addition of PrivateAssets and IncludeAssets attributes to xunit.analyzers improves package reference best practices.

Also applies to: 40-40, 42-42, 47-50

tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj (1)

4-4: Test project upgrade mirrors Console test project pattern.

The framework and package updates are consistent with the Console functional tests project, maintaining uniformity across the test suite.

Also applies to: 40-40, 42-42, 47-50

src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj (1)

4-4: No action required — .NET 10.0 is officially released and package versions are compatible.

.NET 10.0 was officially released on November 11, 2025, as a Long-Term Support (LTS) version. All referenced packages are available and compatible with .NET 10:

  • GitVersion.MsBuild 6.5.0 (stable, Nov 5, 2025)
  • Serilog.Extensions.Hosting 9.0.0 (stable)
  • Serilog.Settings.Configuration 10.0.0 (Nov 26, 2025)
  • Microsoft.Extensions.Hosting 10.0.0 (compatible with net10.0)

The target framework configuration is current and appropriate for production use.

@codacy-production
Copy link

codacy-production bot commented Dec 1, 2025

Coverage summary from Codacy

See diff coverage on Codacy

Coverage variation Diff coverage
Report missing for 4e59d121
Coverage variation details
Coverable lines Covered lines Coverage
Common ancestor commit (4e59d12) Report Missing Report Missing Report Missing
Head commit (bd912a1) 135 134 99.26%

Coverage variation is the difference between the coverage for the head and common ancestor commits of the pull request branch: <coverage of head commit> - <coverage of common ancestor commit>

Diff coverage details
Coverable lines Covered lines Diff coverage
Pull request (#153) 0 0 ∅ (not applicable)

Diff coverage is the percentage of lines that are covered by tests out of the coverable lines that the pull request added or modified: <covered lines added or modified>/<coverable lines added or modified> * 100%

See your quality gate settings    Change summary preferences

Footnotes

  1. Codacy didn't receive coverage data for the commit, or there was an error processing the received data. Check your integration for errors and validate that your coverage setup is correct.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
Build/tag-with-semver.ps1 (1)

1-7: ⚠️ Potential issue | 🟠 Major

Push only the tag you just rewrote.

Line 6 force-moves the local tag, but Line 7 pushes all tags without --force. On reruns, this fails when the tag already exists remotely, and it can also publish unrelated local tags. Push only the specific tag and match the force semantics.

Proposed fix
 git tag $tag -f
-git push --tags
+git push origin "refs/tags/$tag" --force
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@Build/tag-with-semver.ps1` around lines 1 - 7, The script currently
force-recreates the local tag ($tag) with git tag -f but then pushes all tags
(git push --tags), which can fail or publish unrelated tags; change the push to
only push the rewritten tag and preserve force semantics by replacing the global
push with a targeted force push of $tag (e.g., use git push --force origin
refs/tags/$tag or git push origin --force $tag) so only the specific tag is
pushed and remote is updated to match the local force move.
src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj (1)

51-52: ⚠️ Potential issue | 🟠 Major

Quote the publish script invocation and stop hard-coding PowerShell.

Line 52 will split $(ProjectDir) and $(PublishDir) on spaces, and PowerShell is not the executable name on Linux/macOS agents. Please quote every path/argument and use an OS-specific shell property; the post-build target should get the same fix so both paths behave consistently.

Proposed fix

Add this once near the top of the project:

<PropertyGroup>
  <PowerShellExecutable Condition="'$(OS)' == 'Windows_NT'">powershell</PowerShellExecutable>
  <PowerShellExecutable Condition="'$(OS)' != 'Windows_NT'">pwsh</PowerShellExecutable>
</PropertyGroup>
 <Target Name="ConsolePostBuildConfigUpdate" AfterTargets="PostBuildEvent">
-    <Exec Command="PowerShell -NoProfile -ExecutionPolicy unrestricted -file $(ProjectDir)../../Build/set-platform-specific-config.ps1 $(OutDir) $(OS)" />
+    <Exec Command="&quot;$(PowerShellExecutable)&quot; -NoProfile -ExecutionPolicy unrestricted -File &quot;$(ProjectDir)../../Build/set-platform-specific-config.ps1&quot; &quot;$(OutDir)&quot; &quot;$(OS)&quot;" />
 </Target>

 <Target Name="ConsolePostPublishConfigUpdate" AfterTargets="Publish">
-	<Exec Command="PowerShell -NoProfile -ExecutionPolicy unrestricted -file $(ProjectDir)../../Build/set-platform-specific-config.ps1 $(PublishDir) $(OS)" />
+	<Exec Command="&quot;$(PowerShellExecutable)&quot; -NoProfile -ExecutionPolicy unrestricted -File &quot;$(ProjectDir)../../Build/set-platform-specific-config.ps1&quot; &quot;$(PublishDir)&quot; &quot;$(OS)&quot;" />
 </Target>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj` around lines 51 - 52,
The post-publish target ConsolePostPublishConfigUpdate currently hard-codes
PowerShell and leaves paths unquoted; introduce a PowerShellExecutable property
(set to "powershell" on Windows_NT and "pwsh" otherwise), update the <Exec>
Command to use that property instead of the literal "PowerShell", and ensure all
interpolated arguments like $(ProjectDir), $(PublishDir) and $(OS) are
individually quoted to avoid splitting on spaces; apply the same quoting and
PowerShellExecutable usage to the corresponding post-build target so both
targets behave consistently.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Build/build-windows-installer.ps1`:
- Line 34: Replace instances of the global "dotnet tool update --global
GitVersion.Tool --version 6.6.0" invocation with "dotnet tool install --global
GitVersion.Tool --version 6.6.0" so the CI job does not depend on a
pre-installed global tool; update the command in
Build/build-windows-installer.ps1 (symbol: the dotnet tool update line) and make
the same change in build-osx-installer.ps1 (the corresponding line around the
GitVersion.Tool call) and tag-with-semver.ps1 (the initial dotnet tool
invocation), ensuring you use install --global and add --allow-prerelease only
if you need prerelease versions.

In
`@Installer/Elzik.FmSync.WindowsInstaller/Elzik.FmSync.WindowsInstaller.wixproj`:
- Line 12: The project still overrides GitVersionTargetFramework to net8.0 while
upgrading GitVersion.MsBuild to 6.6.0; update the MSBuild property
GitVersionTargetFramework in Elzik.FmSync.WindowsInstaller.wixproj from "net8.0"
to "net10.0" so it matches the rest of the codebase and the new GitVersion
package; locate the GitVersionTargetFramework property in the project file and
change its value to "net10.0", then rebuild to confirm no target-framework
mismatches.

In
`@tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj`:
- Around line 32-39: Remove the coverlet.collector package reference from the
test project: locate the <PackageReference Include="coverlet.collector"
Version="8.0.0"> entry in Elzik.FmSync.Worker.Tests.Functional.csproj and delete
that entire PackageReference block so only coverlet.msbuild remains (preserve
the existing coverlet.msbuild PackageReference); this ensures coverage is
collected via coverlet.msbuild as required by the build script.

---

Outside diff comments:
In `@Build/tag-with-semver.ps1`:
- Around line 1-7: The script currently force-recreates the local tag ($tag)
with git tag -f but then pushes all tags (git push --tags), which can fail or
publish unrelated tags; change the push to only push the rewritten tag and
preserve force semantics by replacing the global push with a targeted force push
of $tag (e.g., use git push --force origin refs/tags/$tag or git push origin
--force $tag) so only the specific tag is pushed and remote is updated to match
the local force move.

In `@src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj`:
- Around line 51-52: The post-publish target ConsolePostPublishConfigUpdate
currently hard-codes PowerShell and leaves paths unquoted; introduce a
PowerShellExecutable property (set to "powershell" on Windows_NT and "pwsh"
otherwise), update the <Exec> Command to use that property instead of the
literal "PowerShell", and ensure all interpolated arguments like $(ProjectDir),
$(PublishDir) and $(OS) are individually quoted to avoid splitting on spaces;
apply the same quoting and PowerShellExecutable usage to the corresponding
post-build target so both targets behave consistently.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: f278317c-1b06-4447-9ec8-92c6da00038d

📥 Commits

Reviewing files that changed from the base of the PR and between 8d751fc and fd51f37.

📒 Files selected for processing (14)
  • .github/workflows/continuous-delivery.yml
  • Build/build-osx-installer.ps1
  • Build/build-windows-installer.ps1
  • Build/tag-with-semver.ps1
  • Installer/Elzik.FmSync.WindowsInstaller/Elzik.FmSync.WindowsInstaller.wixproj
  • src/Elzik.FmSync.Application/Elzik.FmSync.Application.csproj
  • src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj
  • src/Elzik.FmSync.Domain/Elzik.FmSync.Domain.csproj
  • src/Elzik.FmSync.Infrastructure/Elzik.FmSync.Infrastructure.csproj
  • src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj
  • tests/Elzik.FmSync.Application.Tests.Unit/Elzik.FmSync.Application.Tests.Unit.csproj
  • tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj
  • tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj
  • tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj
🚧 Files skipped from review as they are similar to previous changes (6)
  • src/Elzik.FmSync.Domain/Elzik.FmSync.Domain.csproj
  • Build/build-osx-installer.ps1
  • src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj
  • tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj
  • src/Elzik.FmSync.Application/Elzik.FmSync.Application.csproj
  • .github/workflows/continuous-delivery.yml

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj (1)

40-48: ⚠️ Potential issue | 🟡 Minor

Consider .NET 8 runtime requirement for xunit.runner.visualstudio 3.1.5.

The xunit.runner.visualstudio 3.x series is compatible with xunit 2.x. However, version 3.1.0 and later require .NET 8 as the minimum runtime for the runner utility. If this test project targets an older .NET version, the 3.1.5 runner may encounter runtime compatibility issues. Consider pinning to an earlier 3.x version (e.g., 3.0.2) if .NET 8 is not available.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj`
around lines 40 - 48, The xunit.runner.visualstudio PackageReference currently
uses version 3.1.5 which requires .NET 8; either downgrade the PackageReference
for xunit.runner.visualstudio from "3.1.5" to a .NET‑7 compatible version like
"3.0.2" or update the test project's TargetFramework to net8.0 so the runner's
runtime requirement is met—modify the PackageReference element with
Include="xunit.runner.visualstudio" (or adjust the TargetFramework element)
accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In
`@tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj`:
- Around line 40-48: The xunit.runner.visualstudio PackageReference currently
uses version 3.1.5 which requires .NET 8; either downgrade the PackageReference
for xunit.runner.visualstudio from "3.1.5" to a .NET‑7 compatible version like
"3.0.2" or update the test project's TargetFramework to net8.0 so the runner's
runtime requirement is met—modify the PackageReference element with
Include="xunit.runner.visualstudio" (or adjust the TargetFramework element)
accordingly.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 7cdcb512-5fe8-4068-8165-e32c5376fd0f

📥 Commits

Reviewing files that changed from the base of the PR and between fd51f37 and 7c0d085.

📒 Files selected for processing (4)
  • tests/Elzik.FmSync.Application.Tests.Unit/Elzik.FmSync.Application.Tests.Unit.csproj
  • tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj
  • tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj
  • tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

🧹 Nitpick comments (2)
tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj (1)

34-45: Minor: Inconsistent indentation on PackageReference elements.

Lines 34, 35, 40, 41, and 45 have a leading space before the <PackageReference tag, while line 30 does not. This is purely cosmetic.

🧹 Proposed fix for consistent indentation
-  	  <PackageReference Include="Microsoft.NET.Test.Sdk" />
-  	  <PackageReference Include="Shouldly" />
+		<PackageReference Include="Microsoft.NET.Test.Sdk" />
+		<PackageReference Include="Shouldly" />

Apply similar spacing adjustments to lines 40, 41, and 45.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj`
around lines 34 - 45, The PackageReference elements have inconsistent leading
spaces; normalize indentation so all <PackageReference .../> tags match the
existing style (no leading space) used earlier in the file. Update the entries
including SonarAnalyzer.CSharp, xunit.analyzers, xunit.runner.visualstudio (and
any other PackageReference tags shown) to remove the extra leading space so
indentation is consistent across the csproj.
src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj (1)

29-29: Consider removing Serilog.Sinks.File if no longer used.

Based on the summary, the File sink configuration was removed from appSettings.json. If file logging is no longer needed, this package reference could be removed to reduce dependencies.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj` at line 29, The project
still references the Serilog.Sinks.File package even though file sink config was
removed; remove the PackageReference for "Serilog.Sinks.File" from the
Elzik.FmSync.Console.csproj (the <PackageReference Include="Serilog.Sinks.File"
/> element) to drop the unused dependency, then run dotnet restore/build to
verify nothing else depends on that sink and update any remaining logging
configuration if necessary.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Nitpick comments:
In `@src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj`:
- Line 29: The project still references the Serilog.Sinks.File package even
though file sink config was removed; remove the PackageReference for
"Serilog.Sinks.File" from the Elzik.FmSync.Console.csproj (the <PackageReference
Include="Serilog.Sinks.File" /> element) to drop the unused dependency, then run
dotnet restore/build to verify nothing else depends on that sink and update any
remaining logging configuration if necessary.

In
`@tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj`:
- Around line 34-45: The PackageReference elements have inconsistent leading
spaces; normalize indentation so all <PackageReference .../> tags match the
existing style (no leading space) used earlier in the file. Update the entries
including SonarAnalyzer.CSharp, xunit.analyzers, xunit.runner.visualstudio (and
any other PackageReference tags shown) to remove the extra leading space so
indentation is consistent across the csproj.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3e303450-78df-49bb-bbb6-7dab1056ffeb

📥 Commits

Reviewing files that changed from the base of the PR and between 6e6e06b and 3e917b8.

📒 Files selected for processing (12)
  • .github/dependabot.yml
  • Directory.Packages.props
  • Installer/Elzik.FmSync.WindowsInstaller/Elzik.FmSync.WindowsInstaller.wixproj
  • src/Elzik.FmSync.Application/Elzik.FmSync.Application.csproj
  • src/Elzik.FmSync.Console/Elzik.FmSync.Console.csproj
  • src/Elzik.FmSync.Domain/Elzik.FmSync.Domain.csproj
  • src/Elzik.FmSync.Infrastructure/Elzik.FmSync.Infrastructure.csproj
  • src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj
  • tests/Elzik.FmSync.Application.Tests.Unit/Elzik.FmSync.Application.Tests.Unit.csproj
  • tests/Elzik.FmSync.Console.Tests.Functional/Elzik.FmSync.Console.Tests.Functional.csproj
  • tests/Elzik.FmSync.Infrastructure.Tests.Integration/Elzik.FmSync.Infrastructure.Tests.Integration.csproj
  • tests/Elzik.FmSync.Worker.Tests.Functional/Elzik.FmSync.Worker.Tests.Functional.csproj
💤 Files with no reviewable changes (1)
  • .github/dependabot.yml
🚧 Files skipped from review as they are similar to previous changes (3)
  • Installer/Elzik.FmSync.WindowsInstaller/Elzik.FmSync.WindowsInstaller.wixproj
  • src/Elzik.FmSync.Worker/Elzik.FmSync.Worker.csproj
  • src/Elzik.FmSync.Infrastructure/Elzik.FmSync.Infrastructure.csproj

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@Build/build-osx-installer.ps1`:
- Around line 75-77: The current bootstrap always runs "dotnet tool install" for
GitVersion.Tool and fails on reruns; modify the logic after calling
Get-GitVersionToolVersion (using $gitVersionToolVersion) to first run "dotnet
tool list --global" and check for an existing GitVersion.Tool entry matching the
tool name, then call "dotnet tool update --global GitVersion.Tool --version
$gitVersionToolVersion" when installed or "dotnet tool install --global
GitVersion.Tool --version $gitVersionToolVersion" when not installed so the
bootstrap becomes idempotent.

In `@Build/build-windows-installer.ps1`:
- Around line 34-36: Replace the unconditional dotnet tool install call for
GitVersion.Tool with an idempotent branch: use dotnet tool list --global to
check for GitVersion.Tool (use the same name used in the failing call), and if
present run dotnet tool update --global --version $gitVersionToolVersion
--allow-downgrade, otherwise run dotnet tool install --global --version
$gitVersionToolVersion --allow-downgrade; keep using Get-GitVersionToolVersion
to populate $gitVersionToolVersion and ensure all invocations reference that
variable.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 1c398a1e-9254-4c82-8ed5-4dce5aa6a4c3

📥 Commits

Reviewing files that changed from the base of the PR and between 3e917b8 and bd912a1.

📒 Files selected for processing (7)
  • .github/workflows/continuous-delivery.yml
  • Build/Get-GitVersionToolVersion.psm1
  • Build/build-osx-installer.ps1
  • Build/build-windows-installer.ps1
  • Build/tag-with-semver.ps1
  • Directory.Packages.props
  • Installer/Elzik.FmSync.WindowsInstaller/Elzik.FmSync.WindowsInstaller.wixproj
💤 Files with no reviewable changes (1)
  • Build/tag-with-semver.ps1

@elzik elzik merged commit 33ba012 into main Mar 9, 2026
21 checks passed
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.

1 participant