Add Jellyfin.CodeAnalysis and analyzers to all projects

Integrated Jellyfin.CodeAnalysis as a project reference across core and test projects. Added centrally managed code analysis and style enforcement packages (IDisposableAnalyzers, Microsoft.CodeAnalysis.BannedApiAnalyzers, SerilogAnalyzer, SmartAnalyzers.MultithreadingAnalyzer, StyleCop.Analyzers) to all affected projects. Updated dependency graphs, asset files, and build scripts to ensure analyzers run during builds, enforcing consistent code quality and style rules throughout the codebase. Removed custom warning properties to rely on analyzer enforcement.
This commit is contained in:
2026-02-23 07:03:54 -05:00
parent 8d39eb77e6
commit ede6904433
181 changed files with 22265 additions and 526 deletions
@@ -34,6 +34,9 @@
"net11.0": {
"targetAlias": "net11.0",
"projectReferences": {
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj"
},
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.Database\\Jellyfin.Database.Implementations\\Jellyfin.Database.Implementations.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.Database\\Jellyfin.Database.Implementations\\Jellyfin.Database.Implementations.csproj"
}
@@ -61,10 +64,47 @@
"net11.0": {
"targetAlias": "net11.0",
"dependencies": {
"IDisposableAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.0.8, )",
"versionCentrallyManaged": true
},
"Jellyfin.Sdk": {
"target": "Package",
"version": "[2025.10.21, )",
"versionCentrallyManaged": true
},
"Microsoft.CodeAnalysis.BannedApiAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.14.0, )",
"versionCentrallyManaged": true
},
"Microsoft.Extensions.Logging": {
"target": "Package",
"version": "[11.0.0-preview.1.26104.118, )",
"versionCentrallyManaged": true
},
"SerilogAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[0.15.0, )",
"versionCentrallyManaged": true
},
"SmartAnalyzers.MultithreadingAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[1.1.31, )",
"versionCentrallyManaged": true
},
"StyleCop.Analyzers": {
"suppressParent": "All",
"target": "Package",
"version": "[1.2.0-beta.556, )",
"versionCentrallyManaged": true
}
},
"centralPackageVersions": {
@@ -480,6 +520,9 @@
"E:\\Projects\\pgsql-jellyfin\\Jellyfin.Data\\Jellyfin.Data.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\Jellyfin.Data\\Jellyfin.Data.csproj"
},
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj"
},
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.Extensions\\Jellyfin.Extensions.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.Extensions\\Jellyfin.Extensions.csproj"
}
@@ -507,17 +550,49 @@
"net11.0": {
"targetAlias": "net11.0",
"dependencies": {
"IDisposableAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.0.8, )",
"versionCentrallyManaged": true
},
"Jellyfin.Sdk": {
"target": "Package",
"version": "[2025.10.21, )",
"versionCentrallyManaged": true
},
"Microsoft.CodeAnalysis.BannedApiAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.14.0, )",
"versionCentrallyManaged": true
},
"MimeTypes": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive",
"suppressParent": "All",
"target": "Package",
"version": "[2.5.2, )",
"versionCentrallyManaged": true
},
"SerilogAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[0.15.0, )",
"versionCentrallyManaged": true
},
"SmartAnalyzers.MultithreadingAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[1.1.31, )",
"versionCentrallyManaged": true
},
"StyleCop.Analyzers": {
"suppressParent": "All",
"target": "Package",
"version": "[1.2.0-beta.556, )",
"versionCentrallyManaged": true
}
},
"centralPackageVersions": {
@@ -1044,6 +1119,216 @@
}
}
},
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj": {
"version": "1.0.0",
"restore": {
"projectUniqueName": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj",
"projectName": "Jellyfin.CodeAnalysis",
"projectPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj",
"packagesPath": "C:\\Users\\wjones\\.nuget\\packages\\",
"outputPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\obj\\",
"projectStyle": "PackageReference",
"centralPackageVersionsManagementEnabled": true,
"fallbackFolders": [
"C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"
],
"configFilePaths": [
"E:\\Projects\\pgsql-jellyfin\\NuGet.Config",
"C:\\Users\\wjones\\AppData\\Roaming\\NuGet\\NuGet.Config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config",
"C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config"
],
"originalTargetFrameworks": [
"netstandard2.0"
],
"sources": {
"C:\\Program Files\\dotnet\\library-packs": {},
"https://api.nuget.org/v3/index.json": {}
},
"frameworks": {
"netstandard2.0": {
"targetAlias": "netstandard2.0",
"projectReferences": {}
}
},
"warningProperties": {
"allWarningsAsErrors": true,
"warnAsError": [
"NU1605"
],
"warnNotAsError": [
"NU1902",
"NU1903"
]
},
"restoreAuditProperties": {
"enableAudit": "true",
"auditLevel": "low",
"auditMode": "direct"
},
"SdkAnalysisLevel": "11.0.100"
},
"frameworks": {
"netstandard2.0": {
"targetAlias": "netstandard2.0",
"dependencies": {
"IDisposableAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.0.8, )",
"versionCentrallyManaged": true
},
"Jellyfin.Sdk": {
"target": "Package",
"version": "[2025.10.21, )",
"versionCentrallyManaged": true
},
"Microsoft.CodeAnalysis.Analyzers": {
"suppressParent": "All",
"target": "Package",
"version": "[3.11.0, )",
"versionCentrallyManaged": true
},
"Microsoft.CodeAnalysis.BannedApiAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.14.0, )",
"versionCentrallyManaged": true
},
"Microsoft.CodeAnalysis.CSharp": {
"suppressParent": "All",
"target": "Package",
"version": "[5.0.0, )",
"versionCentrallyManaged": true
},
"NETStandard.Library": {
"suppressParent": "All",
"target": "Package",
"version": "[2.0.3, )",
"autoReferenced": true
},
"SerilogAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[0.15.0, )",
"versionCentrallyManaged": true
},
"SmartAnalyzers.MultithreadingAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[1.1.31, )",
"versionCentrallyManaged": true
},
"StyleCop.Analyzers": {
"suppressParent": "All",
"target": "Package",
"version": "[1.2.0-beta.556, )",
"versionCentrallyManaged": true
}
},
"centralPackageVersions": {
"AsyncKeyedLock": "8.0.2",
"AutoFixture": "4.18.1",
"AutoFixture.AutoMoq": "4.18.1",
"AutoFixture.Xunit2": "4.18.1",
"BDInfo": "0.8.0",
"BitFaster.Caching": "2.5.4",
"BlurHashSharp": "1.4.0-pre.1",
"BlurHashSharp.SkiaSharp": "1.4.0-pre.1",
"CommandLineParser": "2.9.1",
"coverlet.collector": "8.0.0",
"Diacritics": "4.1.4",
"DiscUtils.Udf": "0.16.13",
"DotNet.Glob": "3.1.3",
"FsCheck.Xunit": "3.3.2",
"HarfBuzzSharp.NativeAssets.Linux": "8.3.1.1",
"ICU4N.Transliterator": "60.1.0-alpha.356",
"IDisposableAnalyzers": "4.0.8",
"Ignore": "0.2.1",
"Jellyfin.Sdk": "2025.10.21",
"Jellyfin.XmlTv": "10.8.0",
"libse": "4.0.12",
"LrcParser": "2025.623.0",
"MetaBrainz.MusicBrainz": "8.0.1",
"Microsoft.AspNetCore.Authorization": "11.0.0-preview.1.26104.118",
"Microsoft.AspNetCore.Mvc.Testing": "11.0.0-preview.1.26104.118",
"Microsoft.CodeAnalysis.Analyzers": "3.11.0",
"Microsoft.CodeAnalysis.BannedApiAnalyzers": "4.14.0",
"Microsoft.CodeAnalysis.Common": "5.0.0",
"Microsoft.CodeAnalysis.CSharp": "5.0.0",
"Microsoft.Data.Sqlite": "11.0.0-preview.1.26104.118",
"Microsoft.EntityFrameworkCore": "11.0.0-preview.1.26104.118",
"Microsoft.EntityFrameworkCore.Design": "11.0.0-preview.1.26104.118",
"Microsoft.EntityFrameworkCore.Relational": "11.0.0-preview.1.26104.118",
"Microsoft.EntityFrameworkCore.Sqlite": "11.0.0-preview.1.26104.118",
"Microsoft.EntityFrameworkCore.Tools": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.Caching.Abstractions": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.Caching.Memory": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.Configuration.Abstractions": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.Configuration.Binder": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.DependencyInjection": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.Hosting.Abstractions": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.Http": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.Logging": "11.0.0-preview.1.26104.118",
"Microsoft.Extensions.Options": "11.0.0-preview.1.26104.118",
"Microsoft.NET.Test.Sdk": "18.0.1",
"MimeTypes": "2.5.2",
"Moq": "4.18.4",
"Morestachio": "5.0.1.631",
"NEbml": "1.1.0.5",
"Newtonsoft.Json": "13.0.4",
"Npgsql.EntityFrameworkCore.PostgreSQL": "11.0.0-preview.1",
"PlaylistsNET": "1.4.1",
"Polly": "8.6.5",
"prometheus-net": "8.2.1",
"prometheus-net.AspNetCore": "8.2.1",
"prometheus-net.DotNetRuntime": "4.4.1",
"Serilog.AspNetCore": "10.0.0",
"Serilog.Enrichers.Thread": "4.0.0",
"Serilog.Expressions": "5.0.0",
"Serilog.Settings.Configuration": "10.0.0",
"Serilog.Sinks.Async": "2.1.0",
"Serilog.Sinks.Console": "6.1.1",
"Serilog.Sinks.File": "7.0.0",
"Serilog.Sinks.Graylog": "3.1.1",
"SerilogAnalyzer": "0.15.0",
"SharpFuzz": "2.2.0",
"SkiaSharp": "[3.116.1]",
"SkiaSharp.HarfBuzz": "[3.116.1]",
"SkiaSharp.NativeAssets.Linux": "[3.116.1]",
"SmartAnalyzers.MultithreadingAnalyzer": "1.1.31",
"StyleCop.Analyzers": "1.2.0-beta.556",
"Svg.Skia": "3.4.1",
"Swashbuckle.AspNetCore": "7.3.2",
"Swashbuckle.AspNetCore.ReDoc": "6.9.0",
"System.Text.Json": "11.0.0-preview.1.26104.118",
"TagLibSharp": "2.3.0",
"TMDbLib": "2.3.0",
"UTF.Unknown": "2.6.0",
"xunit": "2.9.3",
"Xunit.Priority": "1.1.6",
"xunit.runner.visualstudio": "2.8.2",
"Xunit.SkippableFact": "1.5.61",
"z440.atl.core": "7.11.0"
},
"imports": [
"net461",
"net462",
"net47",
"net471",
"net472",
"net48",
"net481"
],
"assetTargetFallback": true,
"warn": true,
"runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\11.0.100-preview.1.26104.118\\RuntimeIdentifierGraph.json"
}
}
},
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.Database\\Jellyfin.Database.Implementations\\Jellyfin.Database.Implementations.csproj": {
"version": "10.11.0",
"restore": {
@@ -1073,7 +1358,11 @@
"frameworks": {
"net11.0": {
"targetAlias": "net11.0",
"projectReferences": {}
"projectReferences": {
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj"
}
}
}
},
"warningProperties": {
@@ -1097,6 +1386,20 @@
"net11.0": {
"targetAlias": "net11.0",
"dependencies": {
"IDisposableAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.0.8, )",
"versionCentrallyManaged": true
},
"Microsoft.CodeAnalysis.BannedApiAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.14.0, )",
"versionCentrallyManaged": true
},
"Microsoft.EntityFrameworkCore.Design": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers, BuildTransitive",
"suppressParent": "All",
@@ -1120,6 +1423,24 @@
"target": "Package",
"version": "[8.6.5, )",
"versionCentrallyManaged": true
},
"SerilogAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[0.15.0, )",
"versionCentrallyManaged": true
},
"SmartAnalyzers.MultithreadingAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[1.1.31, )",
"versionCentrallyManaged": true
},
"StyleCop.Analyzers": {
"suppressParent": "All",
"target": "Package",
"version": "[1.2.0-beta.556, )",
"versionCentrallyManaged": true
}
},
"centralPackageVersions": {
@@ -1531,7 +1852,11 @@
"frameworks": {
"net11.0": {
"targetAlias": "net11.0",
"projectReferences": {}
"projectReferences": {
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj"
}
}
}
},
"warningProperties": {
@@ -1568,10 +1893,42 @@
"version": "[60.1.0-alpha.356, )",
"versionCentrallyManaged": true
},
"IDisposableAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.0.8, )",
"versionCentrallyManaged": true
},
"Jellyfin.Sdk": {
"target": "Package",
"version": "[2025.10.21, )",
"versionCentrallyManaged": true
},
"Microsoft.CodeAnalysis.BannedApiAnalyzers": {
"include": "Runtime, Build, Native, ContentFiles, Analyzers",
"suppressParent": "All",
"target": "Package",
"version": "[4.14.0, )",
"versionCentrallyManaged": true
},
"SerilogAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[0.15.0, )",
"versionCentrallyManaged": true
},
"SmartAnalyzers.MultithreadingAnalyzer": {
"suppressParent": "All",
"target": "Package",
"version": "[1.1.31, )",
"versionCentrallyManaged": true
},
"StyleCop.Analyzers": {
"suppressParent": "All",
"target": "Package",
"version": "[1.2.0-beta.556, )",
"versionCentrallyManaged": true
}
},
"centralPackageVersions": {
@@ -1986,6 +2343,9 @@
"projectReferences": {
"E:\\Projects\\pgsql-jellyfin\\MediaBrowser.Model\\MediaBrowser.Model.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\MediaBrowser.Model\\MediaBrowser.Model.csproj"
},
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj"
}
}
}
@@ -1012,11 +1012,26 @@
"build/net6.0/xunit.runner.visualstudio.props": {}
}
},
"Jellyfin.CodeAnalysis/1.0.0": {
"type": "project",
"framework": ".NETStandard,Version=v2.0",
"dependencies": {
"Jellyfin.Sdk": "2025.10.21"
},
"compile": {
"bin/placeholder/Jellyfin.CodeAnalysis.dll": {}
},
"runtime": {
"bin/placeholder/Jellyfin.CodeAnalysis.dll": {}
}
},
"Jellyfin.Data/10.12.0": {
"type": "project",
"framework": ".NETCoreApp,Version=v11.0",
"dependencies": {
"Jellyfin.CodeAnalysis": "1.0.0",
"Jellyfin.Database.Implementations": "10.11.0",
"Jellyfin.Sdk": "2025.10.21",
"Microsoft.Extensions.Logging": "11.0.0-preview.1.26104.118"
},
"compile": {
@@ -1030,6 +1045,7 @@
"type": "project",
"framework": ".NETCoreApp,Version=v11.0",
"dependencies": {
"Jellyfin.CodeAnalysis": "1.0.0",
"Microsoft.EntityFrameworkCore.Relational": "11.0.0-preview.1.26104.118",
"Polly": "8.6.5"
},
@@ -1046,6 +1062,7 @@
"dependencies": {
"Diacritics": "4.1.4",
"ICU4N.Transliterator": "60.1.0-alpha.356",
"Jellyfin.CodeAnalysis": "1.0.0",
"Jellyfin.Sdk": "2025.10.21"
},
"compile": {
@@ -1059,6 +1076,7 @@
"type": "project",
"framework": ".NETCoreApp,Version=v11.0",
"dependencies": {
"Jellyfin.CodeAnalysis": "1.0.0",
"Jellyfin.Data": "10.12.0",
"Jellyfin.Extensions": "10.12.0",
"Jellyfin.Sdk": "2025.10.21"
@@ -2556,6 +2574,11 @@
"xunit.runner.visualstudio.nuspec"
]
},
"Jellyfin.CodeAnalysis/1.0.0": {
"type": "project",
"path": "../../src/Jellyfin.CodeAnalysis/Jellyfin.CodeAnalysis.csproj",
"msbuildProject": "../../src/Jellyfin.CodeAnalysis/Jellyfin.CodeAnalysis.csproj"
},
"Jellyfin.Data/10.12.0": {
"type": "project",
"path": "../../Jellyfin.Data/Jellyfin.Data.csproj",
@@ -2580,6 +2603,7 @@
"projectFileDependencyGroups": {
"net11.0": [
"FsCheck.Xunit >= 3.3.2",
"Jellyfin.CodeAnalysis >= 1.0.0",
"Jellyfin.Model >= 10.12.0",
"Jellyfin.Sdk >= 2025.10.21",
"Microsoft.CodeAnalysis.BannedApiAnalyzers >= 4.14.0",
@@ -2629,6 +2653,9 @@
"projectReferences": {
"E:\\Projects\\pgsql-jellyfin\\MediaBrowser.Model\\MediaBrowser.Model.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\MediaBrowser.Model\\MediaBrowser.Model.csproj"
},
"E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj": {
"projectPath": "E:\\Projects\\pgsql-jellyfin\\src\\Jellyfin.CodeAnalysis\\Jellyfin.CodeAnalysis.csproj"
}
}
}
@@ -1,6 +1,6 @@
{
"version": 2,
"dgSpecHash": "n/Uqe7ageCk=",
"dgSpecHash": "S2M6GE9E6Mw=",
"success": true,
"projectFilePath": "E:\\Projects\\pgsql-jellyfin\\tests\\Jellyfin.Model.Tests\\Jellyfin.Model.Tests.csproj",
"expectedPackageFiles": [